如何檢查所有參數是否都是檔案?

如何檢查所有參數是否都是檔案?

如何檢查傳遞給 shell 腳本的所有參數是否都是檔案?我嘗試使用$@參數和-f語句if

答案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

作為第二個循環中的測試。

循環的第一行也可以寫成

for argument in "$@"; do

……但是人們往往會忘記雙引號$@,而且頂部的循環無論如何都比較短。

相關內容