`$1` と代替デフォルトを使用するエイリアスは、引数と代替値を出力します。

`$1` と代替デフォルトを使用するエイリアスは、引数と代替値を出力します。

$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

  1. 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
    
    もちろん、変数も引用する必要があります。
  2. echo引数にバックスラッシュが含まれていると、奇妙な効果が現れます。
    printfバックスラッシュも処理できますが...
  3. ...動作はprintf標準化されていますが、約42種類のバージョンがあります  echo
  4. この演習で最も重要なのは、 echo引数間の境界が明示されていないことです。同じ出力を生成しますecho Super Userecho "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

関連情報