私は初めてBashスクリプトに触れました。より高度な/有用なスクリプトの基礎として使用する「テストスクリプト」があります。
#!/bin/bash
files=$1
for a in $files
do
echo "$a"
done
引用符なしで呼び出すと、ディレクトリ内の1つのファイルのみが選択されます。
testscript *.txt
しかし、引用符を使用して呼び出すとうまく機能し、すべてのテキストファイルを選択します。
testscript '*.txt'
ここで何が起こっているのでしょうか?
答え1
プログラムを呼び出すとき
testscript *.txt
それからあなたのシェルすべての値を拡張して計算します。したがって、プログラムを効果的に呼び出すことができます。
testscript file1.txt file2.txt file3.txt file4.txt
今、あなたのプログラムは見るだけで$1
適用されますfile1.txt
。
コマンドラインから引用すると、リテラル文字列がに保存され、*.txt
スクリプトに渡されます$1
。for
その後、ループはそれを拡張します。
通常、次のスクリプトでは and を使用します"$@"
。$1
これはCMDを使用してスクリプトを作成する人にとっては「問題」であり、コマンドシェルではこれを行うことはできません。ワイルドカード(よく知られている)常にリテラル文字列を渡します。
答え2
引用符がない場合、シェルは*.txt
スクリプトを呼び出す前に拡張されるため、$1
最初のファイルのみが拡張されます。この時点で、すべてのtxt
ファイルはスクリプトの引数です(あまり多くないと仮定)。
引用符を使用すると、文字列は拡張されずにスクリプトに渡され、必要に応じてスクリプトがfor
拡張されます。