一致するものがない場合、Bash 拡張は空です。

一致するものがない場合、Bash 拡張は空です。

次のコードを実行すると:

./script *.txt

*.txt.txt拡張子を持つすべてのファイルに展開されます。ただし、そのファイルが存在しない場合、スクリプトは*.txt文字列として呼び出されます。そのファイルが存在しないときに ""に強制拡張する方法があるかどうか疑問に思います。したがって、ファイルが存在しない場合は、パラメータなしでスクリプトが呼び出されます。

どんなアイデアがありますか?

答え1

これを行う方法には、便利で実行可能な方法に応じていくつかの方法があります。

  • スクリプトを変更することはできませんが、引数が正常にインポートされないことを処理する場合は、次nullglobのコマンドを使用してshopt -s nullglobファイル名のグロービングを実行し、スクリプトを呼び出すシェルでシェルオプションを設定します。一致するものがない場合、パターンは完全に削除されます。 (このモードはいいえ空の文字列はまだ引数と見なされるため、空の文字列に置き換えられます。 )

  • スクリプトを変更できず、引数を取得できないことを正常に処理できない場合は、failglobファイル名のグロービングを実行し、スクリプトを呼び出すシェルでsetシェルオプションを使用してください。shopt -s failglobパターンが一致しない場合、シェルでエラーが発生し、スクリプトはいいえまったく呼び出されません。

  • もしあなたならできるスクリプトを変更し、最初の引数をテストして[ -e "$1" ]ファイルシステムに存在することを確認します。存在する場合は、ファイル名のワイルドカードパターンが何かと一致することがわかります。その後、通常どおり処理を続行できます。そうでなければ、パターンがどんなものとも一致しないと仮定し(引数なしでスクリプトが呼び出されるか、パターンが壊れたシンボリックリンク(および他のもの)と一致する)、必要に応じて必要なアクションをとるターゲットにすることができます。

    #!/bin/bash
    
    if ! [ -e "$1" ]; then
        # no files given
        exit 1
    fi
    
    # continue processing names from "$@"...
    
  • 前のポイントと似ていますが、スクリプトを呼び出す前にテストしてください。

    set -- *.txt
    [ -e "$1" ] && ./script "$@"
    

関連情報