如何检查所有参数是否都是文件?

如何检查所有参数是否都是文件?

如何检查传递给 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

...但是人们往往会忘记双引号$@,而且顶部的循环无论如何都比较短。

相关内容