例:
$ eval echo "{x,y,z}\ --opt\; "
x --opt; y --opt; z --opt;
2番目のリストが{1,2,3}
あり、その長さが最初の(初期)リストの長さと同じであるとします。
質問:
- 農産物の作り方
bash
:
x --opt 1; y --opt 2; z --opt 3;
- 製品の作成方法
bash
(例:リストの要素を参照{x,y,z}
):
x --opt x; y --opt y; z --opt z;
単一の裏地が好ましい。
答え1
ブレーキ拡張はすべての可能なペアを生成し、両方のリストを並列に巡回しません。
$ echo {x,y,z}' --opt; '{1,2,3}
x --opt; 1 x --opt; 2 x --opt; 3 y --opt; 1 y --opt; 2 y --opt; 3 z --opt; 1 z --opt; 2 z --opt; 3
必要な出力を生成するには、他のものを使用する必要があります。たとえば、配列のインデックスを繰り返す場合は、次のようになります。
#! /bin/bash
opt1=(x y z)
opt2=(1 2 3)
for i in "${!opt1[@]}" ; do
printf '%s --opt %s; ' "${opt1[i]}" "${opt2[i]}"
done
echo
または連想配列を使用します。
#! /bin/bash
declare -A opts=([x]=1 [y]=2 [z]=3)
for i in "${!opts[@]}" ; do
printf '%s --opt %s; ' "$i" "${opts[$i]}"
done
echo
答え2
チョロバ指摘を使用すると、{x..z}' --opt '{1..3}';'
すべての可能な文字列の組み合わせが生成されます。
可能なすべての組み合わせ(1〜9)のリストには、1、5、9の4つの組み合わせがすべて必要です。
set -- {x..z}' --opt '{1..3}';'
eval echo '${'{1..9..4}'}'
または、配列を使用して要素0、4、8を取得します。
strings=( {x..z}' --opt '{1..3}';' )
eval echo '${strings['{0..8..4}']}'
私は決してこのような実際のコードを書くことはなく、上記のコードによって生成された文字列はシェルによって明示的に分割される必要があるので、実際のコマンド/引数として使用するのは本当に役に立ちません。
このコードは純粋に興味深い情報で提供されます。