以下は関数の例です。
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
代わりに使用してくださいecho
。printf
ユーティリティはフォーマット文字列を最初の引数として使用します(これはいつもは一重引用符で囲まれた文字列です。文字列には、追加のパラメーターのプレースホルダーが含まれています。
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が引数を印刷したいと仮定していますが、括弧内に引数を渡したいと思うかもしれません。その他のコマンドまたはecho
。printf
シェルにはetc [1]がないので、mapcar
唯一の方法は単純なループcmd
です(プレースホルダを実際のコマンドに置き換えます)。
function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }
ちなみに、ソースでは、echo "TextBefore $@ TextAfter"
呼び出しがa、、...、$@
に設定されたときに別の引数がwill、、...、に渡されました。活用するにはあまり意味がない状況です。A1B
A2B
A5B
echo
TextBefore A1B
A2B
A5B TextAfter
$@
xargs
[1] 正しいことですが、このような単純な場合には、罠と欠点を克服する手間をする価値はありません。xargs