2016-08-05 2 views
1

入力$ 1が繰り返し処理するファイルパターンである汎用bashスクリプトを作成しています。今、私はbashシェルスクリプト - cmd行argで指定された特定のパターンのファイルを一覧表示します。

for entry in ./$1; do 
    echo "$entry" 
done 

を持っているが、私はこれを実行すると、パターンPRMの多くのファイルがありますが、私は*

$ ./stuff.sh PRM* 
./PRM.EDTOUT.ZIP 

を取得します。このパターンをコマンドライン引数で指定し、同じパターンのすべてのファイルを正しくリストする方法はありますか?

+2

あなたは './stuff.sh PRM *'を実行すると、bashはグロブを拡張し、 './stuff.sh PRM.EDTOUT.ZIPのPRMを実行します.other.matches.zip'。あなたのスクリプトはパターンを見ることはありません。すべての引数( '$ @"; do .. 'または単に' for entry; do 'のエントリ)をループする必要があります –

+0

' ./stuff.sh "PRM * '。スクリプトを1行に変更することもできます: 'ls $ 1'でも入力を引用する必要がありますので、スクリプトがそれを取得する前に展開されません。 – JNevill

答えて

4

./stuff.sh PRM*に電話すると、PRM*がシェルによって一致するファイルに展開されます。 あなたが拡大せずにパターンを渡したい場合は、あなたがそれを引用する必要があります。

./stuff.sh 'PRM*' 

しかし、実際には、それだけ(のようにそれを使用、それを引用していないシェルがそれを拡張させた方がよいでしょうあなたの一例)が、このように、複数の引数を取るようにスクリプトを変更:そうですね

for entry; do 
    echo "$entry" 
done 

は、for entry後にない「での」ありません。必要はありません。 forループでは、 "in"句がない場合、デフォルトで位置パラメータが使用されます。つまり 、上記の本に相当します。

for entry in "[email protected]"; do 
    echo "$entry" 
done 
+0

引用符で囲まれたパターン:引数の長さを渡すための1点。 './stuff.sh PRM *'から得られるコマンドラインのサイズは制限されています。パターンがあまりにも多くのファイルと一致する場合は、「引数リストが長すぎます」というエラーが発生します。 'bash'組み込みコマンドは、' for'ループのように、その制限の対象ではありません。違いを見るには 'echo {1..100000}'と '/ bin/echo {1..100000}'を比較してください。 (あなたのシステムによっては、上限が十分であるかもしれません、あるいはそれを増やす必要があります)。 – chepner

+0

正しい構文はセミコロンなしで 'for do do'です。 http://stackoverflow.com/questions/36896830/is-a-semicolon-prohibited-after-name-in-for-name-doを参照してください。 – rici

関連する問題