如何檢查傳遞給 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
……但是人們往往會忘記雙引號$@
,而且頂部的循環無論如何都比較短。