{}
を引き付けずに拡張子で変数を使用できますかeval
?それでは、どうすればいいですか?
これはうまくいきません:
$ touch 1.foo 1.bar
$ ls 1.{foo,bar}
1.bar 1.foo
$ extensions=foo,bar
$ ls 1.{$extensions}
ls: cannot access 1.{foo,bar}: No such file or directory
適用対象eval
:
$ eval ls 1.{$extensions}
1.bar 1.foo
答え1
答え2
中かっこ内で変数を拡張する方法は次のとおりです。評価なし:
end=3
declare -a 'range=({'"1..$end"'})'
これで素晴らしい数字の配列ができました。
for i in ${range[@]};do echo $i;done
1
2
3
bash 4.3.11でテストされていますが、すべての最新バージョンで動作します。
答え3
Bashや他のシェルで利用できるもう1つの技術は、配列を使用することです。
$ extensions=(foo bar)
$ ls "${extensions[@]/#/1.}"
これはパラメータ拡張の(パターン置換)形式です。 (残念ながらこれもPOSIX仕様ではありません。)配列の各要素に置換を適用し、要素間の分離を維持することを指定します。中${parameter/pattern/string}
[@]
#
模様文字列は^
正規表現(つまり、ほとんどの置換)と同じように機能します。これは、置換がパラメータ値の先頭でのみ発生できることを意味します。だからs/old/new/
$ ls "${extensions[@]/#/1.}"
等しい
$ ls "${拡張子[0]/#/1.}" "${拡張子[1]/#/1.}"
(この配列にはインデックス0と1の2つの要素があるため)、次に展開されます。
$ ls "1.foo" "1.bar"
引用する
「拡張」に引用符が必要な場合、つまり(おそらく)スペースまたはパス名拡張(ワイルドカード/ワイルドカード)文字が含まれている場合は、引用符が重要です。例えば、
$ extensions=("foo bar" "*r")
それから
$ ls ${extensions[@]/#/1.}
(引用符を除く)は次に展開されます。
$ ls 1.foo bar 1.*r
(ここでは1.foo
、bar
とは別の引数です)、これは次に展開されます。
$ ls 1.foo bar 1.anteater 1.bar 1.bear 1.cougar 1.deer 1.grasshopper …
(1.*r
引用符がないワイルドカードであるため)引用の重要性の詳細については、以下を参照してください。bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク。
文字列の末尾を一致させることもできます。%
で使用模様:
$ fnames=(cat dog)
$ ls "${fnames[@]/%/.c}"
次に展開
$ ls "cat.c" "dog.c"
しかし注意してください:%
いいえ$
正規表現と同じように動作します。必ず入れなければなりませんスタート~の模様
パラメーター値の終わりに限界一致が発生します。たとえば、次のような場合
$ fnames=(cat.c dog.c)
あなたが手に入れcat.o
たいdog.o
、
しないでください "${fnames[@]/.c%/.o}"
- これはうまくいきません。する
$ ls "${fnames[@]/%.c/.o}"
しかし、そうしないでください"${fnames[@]/.c/.o}"
(完全に無視してください%
)。 "fnames"の1つがある場合は、次のようdog.catcher.c
に変換されます(なぜならdog.oatcher.c
最初 .c
)に置き換えられます.o
。
残念ながら、プレフィックスとサフィックスを簡単に追加する方法はありません。
$ ls 1.{foo,bar}.c
変数、配列、およびそれらに適用できる変換の詳細については、bashのドキュメントを参照してください。