次のパターンに一致するすべてのファイルを圧縮するためのbashシェルスクリプトを作成しました。
#!/bin/bash
zip $1 $2
./myScript.sh myzip test*
上記のスクリプトを使用して実行するときテスト私のディレクトリに、このパターンと一致する2つのファイル(test1とtest2)があってもzipに追加されます。
zip
シェルから直接コマンドを実行すると、期待どおりに機能し、両方が追加されます。テスト1そしてテスト2myzipに。ただし、これを行うためにスクリプトを使用すると、ファイルは1つだけ追加されます。
私は何を見逃していますか?
答え1
このようにスクリプトを呼び出すと
./myScript.sh myzip test*
パラメータとを使用してスクリプトを提供しますmyzip
。シェルはtest1
実際にスクリプトを呼び出す前にパターンtest2
の最後の2つのパラメータを拡張します。では使用できますが、スクリプトでは使用されません。test*
test2
$3
$3
この問題は2つの方法で解決できます。
引数リストからアーカイブ名を選択し、リストを移動して位置引数リストからアーカイブ名を削除し、最後に呼び出し
"$@"
で(残りの引数)を使用しますzip
。#!/bin/sh archive=$1 shift zip "$archive" "$@"
すべての変数が引用されているため、スペースなどのファイル名を使用することもできます。
の場合、
bash
次のように読みにくくなります。#!/bin/bash zip "$1" "${@:2}"
ユーティリティ
zip
は、シェルグローブパターン自体を拡張する方法を知っています。この事実を使ってスクリプトに模様ファイル名リストの代わりに:#!/bin/sh zip "$1" "$2"
このスクリプトを呼び出す必要があります。
./myScript.sh myzip 'test*'
引用すると、
test*
シェル拡張モード(私たちが望むもの)が防止されます。頼る最初のオプションでは)。