要测试是否所有参数都是文件,可以更轻松地测试其中一个参数是否不是文件:
for argument do
if [ ! -f "$argument" ]; then
printf 'Not a file: %s\n' "$argument" >&2
exit 1
fi
done
echo 'All arguments are files'
Run Code Online (Sandbox Code Playgroud)
这将迭代所有位置参数并依次测试每个参数。如果找到非文件,则会打印错误并终止代码。
要调查所有参数:
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
Run Code Online (Sandbox Code Playgroud)
这将迭代所有位置参数并依次测试每个参数,打印测试结果。
请注意,“是一个文件”实际上意味着“是一个普通文件,或一个普通文件的符号链接”。如果要确保它不是到常规文件的符号链接,请使用
if [ ! -f "$argument" ] || [ -L "$argument" ]; then
Run Code Online (Sandbox Code Playgroud)
作为第一个循环中的测试,或
if [ -f "$argument" ] && [ ! -L "$argument" ]; then
Run Code Online (Sandbox Code Playgroud)
作为第二个循环中的测试。
循环的第一行也可以写成
for argument in "$@"; do
Run Code Online (Sandbox Code Playgroud)
...但人们往往会忘记双引号$@,而且顶部的循环无论如何输入都更短。