如何检查传递给 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
...但是人们往往会忘记双引号$@
,而且顶部的循环无论如何都比较短。