このBashスクリプトを呼び出すときにファイルパラメータに引用符が必要なのはなぜですか?

このBashスクリプトを呼び出すときにファイルパラメータに引用符が必要なのはなぜですか?

私は初めて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スクリプトに渡されます$1forその後、ループはそれを拡張します。

通常、次のスクリプトでは and を使用します"$@"$1

これはCMDを使用してスクリプトを作成する人にとっては「問題」であり、コマンドシェルではこれを行うことはできません。ワイルドカード(よく知られている)常にリテラル文字列を渡します。

答え2

引用符がない場合、シェルは*.txtスクリプトを呼び出す前に拡張されるため、$1最初のファイルのみが拡張されます。この時点で、すべてのtxtファイルはスクリプトの引数です(あまり多くないと仮定)。

引用符を使用すると、文字列は拡張されずにスクリプトに渡され、必要に応じてスクリプトがfor拡張されます。

関連情報