Bash 中かっこ「バインディング」

Bash 中かっこ「バインディング」

バッシュでは

echo a{b,c}d{e,f}

印刷

abde    abdf    acde    acdf

私が見たい出力は

abde    acdf

つまり、与えられた窒素Bashが使用したいパラメータ構成する各中括弧ペア内の最初のパラメーター窒素ひも。

答え1

これを行うには、配列を使用します。

$ foo=( b c ); bar=( e f ); for i in {0..1}; do echo a${foo[$i]}d${bar[$i]}; done
abde
acdf

実際のユースケースはもう少し複雑であると仮定しているので、他のコマンドを使用して配列を埋め、そのサイズが必ずしもわからない場合は、次のようにします。

foo=( b c ); bar=( e f ); for i in $(seq 0 $((${#foo[@]}-1))); do 
   echo a${foo[$i]}d${bar[$i]}; 
done

答え2

これは愚かな答えですが、とにかく:

$ echo a{b,c,d}e{f,g,h} | awk 'BEGIN {N=3;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

$ echo a{b,c,d,1}e{f,g,h,2} | awk 'BEGIN {N=4;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

$ echo a{b,c,d,1,A}e{f,g,h,2,Z} | awk 'BEGIN {N=5;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

答え3

中かっこの動作方法を変更できません。

たとえば、文字列がテキストに表示されない場合は、配列,に連続した文字列置換を適用できます。

a=(,b,e @c,f)
a=("${a[@]/,/a/}")
a=("${a[@]/,/d}")
echo "${a[@]}"

しかし、ループがより明確になります。部品を互いに接続するには、文字列に表示されない区切り文字を使用できます。,たとえば、中かっこ内には特別な機能があります。

a=(); IFS=,; set -f
for x in b,e c,f; do
  a+=(a${x%*,}d${x#*,})
done

別のアプローチは、2つの並列配列を定義することです。

version=(test main)
files=(AppTest.java App.java)
for ((i=0; i<${#files}; i++) rm "src/$version[i]/java/org/sonatype/mavenbook/files[i].java"

私の考えでは、この特定のコマンドを処理する最も簡単な方法は関数を定義することです。

rmapp () { rm "src/$1/java/org/sonatype/mavenbook/$2.java"; }

関連情報