Bashの逆参照

Bashの逆参照

私は以下を行うために「エレガントな」ソリューションを設計しようとしています。

unzip applications/<abc>.zip -d applications/<abc>/
unzip applications/<def>.zip -d applications/<def>/
unzip applications/<ghi>.zip -d applications/<ghi>/
unzip applications/<jkl>.zip -d applications/<jkl>/

中かっこ拡張は適用されません。これは私が探しているものと「反対」です(または何か抜けましたか?)。

ループがfor行く道ですか?私は過去のコントロール(
何と一緒にxargs引数を逆参照するか)を使用または活用することについて考えましたが、!:1状況はすぐに単純化されるのではなく複雑になりました。

私は正規表現の逆参照に偏っていると思います。シェルに似たものはありますか?

答え1

いくつかの変数拡張規則を持つforループが必要に応じて機能することがあります。

for file in applications/*.zip
do
  unzip "$file" -d "${file%.zip}"
done

この表現は、「${file%.zip}最後からwithの内容を削除する」という意味です。$file.zip

したがって、最初のループは$file読みやすいapplications/abc.zipので${file%.zip}読みますapplications/abc

答え2

あなたが言及したものxargs。 xargs コマンドは、Thompson または Mashey シェルがforループをサポートしていないときに PWB/Unix に現れました。forあなたの場合は、ループが最も適していると思います。ただし、可能であればプログラムでパイプを使用することはエレガントなので、xargsを使用してこれを行う方法は次のとおりです。

printf "%s\n" abc def ghi jkl | xargs -I {} unzip applications/{}.zip -d applications/{}/

答え3

1つの可能性は変数です。前/別のコマンドに割り当てるだけです。

a=abc
unzip applications/"$a".zip -d applications/"$a"/
a=def
!unzip

答え4

はい、forループはあなたの仕事のための素晴らしい解決策です。

for i in abc def ghi jkl; do
    unzip applications/"$i".zip -d applications/"$i"/
done

または、スクリプトの代わりにコマンドラインで使用するには、1行に同じコマンドを使用します。

for i in abc def ghi jkl; do unzip applications/"$i".zip -d applications/"$i"/; done

例の値には引用符は$i必要ありませんが、スペースやその他の特殊文字を含む値が絶対にないと確信している場合は、引用符を使用することをお勧めします。

関連情報