bashスクリプトにパラメータ(= *を含むパス)を渡す方法

bashスクリプトにパラメータ(= *を含むパス)を渡す方法

ここで誰もが*がbashシェルスクリプトに渡されない理由を教えてもらえますか?

私のスクリプトはtop40と呼ばれます。

 #!/bin/bash
 sudo du -shx $1 | sort -rh | head -n 40

実行しようとするとtop40 /var/**は無視されます。それは似ていますtop40 /varが、ディレクトリの最初の40サイズを見たいです。

スクリプトなしでこの操作をプロンプトに入力すると、正常に機能します。

私はこれの理由を本当に見つけることができません。目を開けてくれてありがとう。 Ubuntu 18.04 LTSを使用

答え1

これが基本シェルです。拡張。呼び出しシェルはワイルドカード文字を認識するので、*実際にはあなたに説明してください、/var/のすべての項目のリストをスクリプトに渡します。

もしあなたなら脱出するワイルドカードまたは引用する呼び出しシェルからの拡張を防ぐためのワイルドカードであり、期待どおりにスクリプトに渡されます。

あなたの意図を正しく理解したら、あなたが望むことをすることができる2つの例があります。

  • /path/to/script.sh '/var/run/*'
    • この例では、単一引用符で囲まれた文字列内にアスタリスクを配置して、シェルの解釈を防ぎます。これは拡張をバイパスしているままスクリプトに渡されます。
  • /path/to/script.sh /var/run/\*
    • この例では、単にシェル拡張で単一のアスタリスク文字をエスケープします。

どちらの例も文字列を/var/run/*そのままスクリプトに渡しています$1

関連情報