次のコードを実行すると:
./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 "$@"