すべての引数がファイルであるかどうかを確認するにはどうすればよいでしょうか?

すべての引数がファイルであるかどうかを確認するにはどうすればよいでしょうか?

シェル スクリプトに渡されるすべての引数がファイルであるかどうかをどのように確認しますか?$@パラメーターと-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

...しかし、人々は二重引用符を忘れがちであり$@、上部のループはとにかく入力が短くなります。

関連情報