シェル スクリプトに渡されるすべての引数がファイルであるかどうかをどのように確認しますか?$@
パラメーターと-f
ステートメントを使用しようとしましたif
。
答え1
テストするには全て引数がファイルの場合、引数の1つがないファイル:
for argument do
if [ ! -f "$argument" ]; then
printf 'Not a file: %s\n' "$argument" >&2
exit 1
fi
done
echo 'All arguments are files'
これは、すべての位置パラメータを反復処理し、それぞれを順番にテストします。ファイル以外のものが見つかった場合は、エラーが出力され、コードは終了します。
すべての引数を調査するには:
for argument do
if [ -f "$argument" ]; then
printf 'Is a file: %s\n' "$argument"
else
printf 'Is not a file: %s\n' "$argument"
fi
done
これは、すべての位置パラメータを反復処理し、各パラメータを順番にテストして、テストの結果を出力します。
「ファイル」であることに注意してください実はは「通常のファイル、または通常のファイルへのシンボリックリンク」を意味します。通常のファイルへのシンボリックリンクではないことを確認したい場合は、
if [ ! -f "$argument" ] || [ -L "$argument" ]; then
最初のループのテストとして、または
if [ -f "$argument" ] && [ ! -L "$argument" ]; then
2 番目のループのテストとして。
ループの最初の行は次のように書くこともできる。
for argument in "$@"; do
...しかし、人々は二重引用符を忘れがちであり$@
、上部のループはとにかく入力が短くなります。