$1
パラメータ()を処理してパラメータが指定されていない場合は、デフォルト値にフォールバックできるエイリアスを作成したいと思います。例えば、
$ alias foo='NUM=${1:-42}; echo $NUM'
引数なしで呼び出すと、私が望む方法で動作します。
$ foo
42
ただし、パラメータを使用して呼び出すと、私の値とデフォルト値が印刷されます。
$ foo 69
42 69
なぜこれが起こるのか理解できません。正しく行う方法は?この種の問題を直接デバッグするにはどうすればよいですか?
答え1
エイリアスは別のシェル構文解釈の前のテキスト置換にすぎないため、引数を受け入れません。したがって、次のようになります。
foo 69
テキストfoo
はに変わり、NUM=${1:-42}; echo $NUM
シェルは結果のテキストを解釈します。
NUM=${1:-42}; echo $NUM 69
$1
まだ設定ができていないからです。NUM=42; echo 42 69
現在のシェルで解釈され、引数を使用するインラインスクリプトの場合は、次のようにします。機能代わりに:
foo() {
NUM=${1-42}
printf '%s\n' "$NUM"
}
${1-42}
代わりに、ここでは、${1:-42}
ユーザーが呼び出すときに空の文字列が割り当てられるとfoo ''
想定しています。$NUM
答え2
この種の問題を直接デバッグするにはどうすればよいですか?
標準的な調査ステップは、正確に何が起こったのかを把握するためにドリルダウンすることです。
$ alias foo='NUM=${1:-42}; echo $NUM'
$ foo 69
42 69
$ echo "$NUM"
42
エイリアスを echo として定義しても、$NUM
これは手動で手動で実行する必要があります。上記の設定NUM
は42です。これは、エイリアスの「69」パラメータが割り当てと foo
対話しないという手がかりを提供できますNUM=
。 (明らかな?)結論はこれが唯一の影響を与えるということです echo
。
echo
いくつかの一般的なアドバイスはサポートを避けることですprintf
。
echo
最初の引数がハイフン( '-
')、変数から出た場合も同様です。
もちろん、変数も引用する必要があります。$ NUM="In a perfect world..." $ echo $NUM; echo ABC In a perfect world... ABC $ NUM="-n a perfect world..." $ echo $NUM; echo ABC a perfect world...ABC
echo
引数にバックスラッシュが含まれていると、奇妙な効果が現れます。
printf
バックスラッシュも処理できますが...- ...動作は
printf
標準化されていますが、約42種類のバージョンがありますecho
。 - この演習で最も重要なのは、
echo
引数間の境界が明示されていないことです。同じ出力を生成しますecho Super User
。echo "Super User"
だからこれを試してみてください:
$ alias foop='NUM=${1:-42}; printf "[%s]\n" $NUM'
$ foop
[42]
$ foop 69
[42]
[69]
$ foop The quick brown fox
[42]
[The]
[quick]
[brown]
[fox]
これにより、パラメータがエイリアスの末尾に適用され、割り当てと絡み合わないことが非常に明確になります。また、エイリアスのコードは最初の引数だけを見るものではありません。
これで、エイリアスを制御できないことがわかったので、値がどこから来るのか疑問に$1
思います。NUM
問題を完全に診断する前に、これについて考えてみることを期待するのが合理的なのかはわかりませんが、
$ set Once upon a midnight dreary
$ foo
Once
$ echo "$NUM"
Once
$1
エイリアス定義は、エイリアス呼び出しに渡された引数ではなく、シェルの既存の引数のリストを見ていることを明確にする必要があります。
答え3
エイリアスに関数を使用する:
$ alias foo='function foo { NUM=${1:-42}; echo $NUM; }; foo'
$ foo
42
$ foo 69
69