Bash機能:$ @コマンドを実行すると、各パラメーターは順番に個別に実行されます。

Bash機能:$ @コマンドを実行すると、各パラメーターは順番に個別に実行されます。

以下は関数の例です。

function example { echo "TextBefore $@ TextAfter" ; }

以下は、その機能を使用するコマンドです。

example A{1..5}B

出力:

TextBefore A1B A2B A3B A4B A5B TextAfter

私が望む外観は次のとおりです。

TextBefore A1B TextAfter
TextBefore A2B TextAfter
TextBefore A3B TextAfter
TextBefore A4B TextAfter
TextBefore A5B TextAfter

それが私が説明できる最善の方法です。それを理解し、より良い説明方法を知っている場合は、質問を編集してください。

この例に示すように、シーケンスの各[ここに単語を挿入]を個別に実行するにはどうすればよいですか?

答え1

この試み:

function example { printf 'TextBefore %s TextAfter\n' "$@"; }

答え2

printf代わりに使用してくださいechoprintfユーティリティはフォーマット文字列を最初の引数として使用します(これはいつもは一重引用符で囲まれた文字列です。文字列には、追加のパラメーターのプレースホルダーが含まれています。

printf 'TextBefore %s TextAfter\n' "$@"

のパラメータが"$@"指定された位置に挿入されます%s。フォーマット文字列にはプレースホルダ%sが1つしかないため、フォーマット文字列は各パラメータに対して順番に再利用されます。これはprintf他の言語の仕組みとは異なります。

printf終了改行文字はデフォルトでは出力されません。

例:

$ printf 'AAA %s BBB\n' 1 2 3 4 5
AAA 1 BBB
AAA 2 BBB
AAA 3 BBB
AAA 4 BBB
AAA 5 BBB

フォーマット文字列により多くのプレースホルダがある場合、これらのプレースホルダは指定されたパラメータで順番に入力されますprintf。利用可能なパラメータがさらにある場合は、すべてのプレースホルダを入力してフォーマット文字列が再利用されます。

$ printf 'AAA %s %03d BBB\n' 1 2 3 4 5
AAA 1 002 BBB
AAA 3 004 BBB
AAA 5 000 BBB

したがって、あなたの機能は次のとおりです

example () {
    [ "$#" -gt 0 ] && printf 'TextBefore %s TextAfter\n' "$@"
}

また見なさい:

答え3

どちらの答えもOPが引数を印刷したいと仮定していますが、括弧内に引数を渡したいと思うかもしれません。その他のコマンドまたはechoprintf

シェルにはetc [1]がないので、mapcar唯一の方法は単純なループcmdです(プレースホルダを実際のコマンドに置き換えます)。

function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }

ちなみに、ソースでは、echo "TextBefore $@ TextAfter"呼び出しがa、、...、$@に設定されたときに別の引数がwill、、...、に渡されました。活用するにはあまり意味がない状況です。A1BA2BA5BechoTextBefore A1BA2BA5B TextAfter$@

xargs[1] 正しいことですが、このような単純な場合には、罠と欠点を克服する手間をする価値はありません。xargs

関連情報