ファイル判定で以下のように書くと
「unexpected operator」とエラーになります。
if [ -f /path/*.txt ]; then
echo "OK"
fi
以下のように書けばエラーにならない
if [ -f /path/hoge.txt ]; then
echo "OK"
fi
ワイルドカードを使って1つもファイルがないか、あるいは1つでもファイルがあるかを判定したいのですが、
どう書いたら良いでしょうか。
ワイルドカードが先に展開されて test コマンド(if [ ~ の "[" の実体)の引数になってしまうので、期待した動作にならないはずです。
sh -x スクリプトファイル名
とすれば、その様子が分かると思います。
で、単純に ls コマンドの戻り値を使う方法が考えられます。
ls /path/*.txt >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "No match" else echo "At least one file" fi
ファイルとディレクトリを判定したいとか、読み込み可能か、など test コマンドのパラメータをフルに使いたければ、シェルの関数を書いてあげる感じになります。
# 引数で指定されたファイルがあるかどうかを確認する関数 is_file_exist() { for f in $* do if [ -f $f ] then return 0 fi done return 1 } # こうやって使います if is_file_exist path/*.txt then echo "OK : txt" else echo "NG : txt" fi
# 使う方で [ や ] がないのは、間違いじゃないですよ :-)