次の値を持つ「arr」という配列があります。
post-ro
post-ro-1
post-ro-2
この変数があります。
str="su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri"
str
変数の値を置き換えて、変数で定義されたpg
コマンドを実行したいと思いますarr
。のコマンドは、str
の値を繰り返し、コマンドの各値を順次置き換えて3回(配列の長さ)実行する必要がありますarr
。pg
したがって、最終コマンドは次のようになります。
su scp [email protected]:/etc/bp/post-ro/pri/user.json /etc/bp/post-ro/pri
su scp [email protected]:/etc/bp/post-ro-1/pri/user.json /etc/bp/post-ro-1/pri
su scp [email protected]:/etc/bp/post-ro-2/pri/user.json /etc/bp/post-ro-2/pri
答え1
GNUを使用し、スペースで区切られた引数のリストがに渡されると仮定するxargs
と、次のようになります。$str
su
print0() {
[ "$#" -eq 0 ] || printf '%s\0' "$@"
}
IFS=' ' # split on space only
set -o noglob # disable globbing
xargs -r0a <(print0 "${arr[@]}") -I pg -- $str
(引用符をオフにすると$str
分割+globが呼び出されます。globは無効になり、分割は空間的にのみ分割するように指示されます。)
$str
コマンドに引数を含めるには、配列su
を使用する方が合理的です。
str=(
su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri
)
xargs -r0a <(print0 "${arr[@]}") -I pg -- "${str[@]}"
$IFS
これにより、文字列をパラメータとして分類したり分割したりする必要がなくなりますnoglob
。