2

可変数の「タプル」を引数として bash スクリプトに渡し、次のようなパターン マッチングを使用してループでそれらを処理したいと考えています。

for *,* in "$@"; do
    #do something with first part of tuple
    #do something with second part of tuple
done

これは可能ですか?もしそうなら、どうすればタプルの各部分にアクセスできますか?

たとえば、スクリプトを次のように呼び出したいとします。

bash bashscript.sh first_file.xls,1 second_file,2 third_file,2 ... nth_file,1

4

2 に答える 2

5

にはタプル データ型がないためbash(文字列のみ)、自分でエンコードおよびデコードする必要があります。例えば:

$ bash bashscript.sh first_file.xls,1 second_file,2 third_file,2 ... nth_file,1

bashscript.sh

for tuple in "$@"; do
    IFS=, read first second <<< "$tuple"
    ...
 done
于 2013-07-02T19:50:27.080 に答える
1

はい、可能です。複数の方法があります。変数にプレフィックス/サフィックス展開構文を使用できます (例: ${var#prefix}, ${var##prefix}, ${var%suffix}, ${var%%suffix}- これらは、指定されたパターンに一致する最短または最長のプレフィックス/サフィックスを削除します)。または、位置パラメータをegに置き換えることもできますIFS=, set -- ${var}(ただし、ループを続行できるように、最初に元のパラメータの残りを何らかの方法で保存する必要があります)。のバージョンが十分に新しい場合は、配列を使用できますbash(そうでない場合は、かなり古いものです...)。これらはおそらくより良い方法の3つですが、他にもあります...

編集:サフィックス/プレフィックス展開を使用したいくつかの例:

for tuple in first_file.xls,1
do
  echo ${tuple%,*}     # "first_file.xls"
  echo ${tuple#*,}     # "1"
done

タプルが 2 項以上の場合、その方法はもう少し複雑になります。例えば:

for tuple in x,y,z
do
  first=${tuple%%,*}
  rest=${tuple#${first}}
  second=${rest%%,*}
  last=${rest#*,}
done

その場合、あなたは @chepner のIFS=, read first second third <<< "${tuple}"... の答えを好むかもしれません。タプルから配列を設定することも、許容される代替手段です。

ただし、単純なペアの場合は、必要に応じてプレフィックス/サフィックスを削除することを好む傾向があります...

于 2013-07-02T19:53:34.533 に答える