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

Luc*_*uca 3 bash test arguments

如何检查传递给 shell 脚本的所有参数是否都是文件?我试图使用$@参数,-f与if声明。

Kus*_*nda 7

要测试是否所有参数都是文件,可以更轻松地测试其中一个参数是否不是文件:

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)

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