我正在编写一条if语句,它通过执行以下操作检查文件是否可读并存在:

if [[ -r "$upFN" && -f "$upFN" ]]; then
....
fi

然后我想,您可以将其缩小,也许是这样的:
if [[ -r -f "$upFN" ]]; then
....
fi

但这不起作用,它返回错误:
./ftp.sh: line 72: syntax error in conditional expression
./ftp.sh: line 72: syntax error near `"$upFN"'
./ftp.sh: line 72: `if [[ -r -f "$upFN" ]]; then'

最佳答案

AFAICT,没有办法将它们进一步结合起来。作为可移植性说明,[[ expr ]]的可移植性低于[ expr ]test expr。 C风格的&&||仅包含在bash中,因此您可能要考虑对,和将-a-o用作POSIX语法。就个人而言,我更喜欢使用test expr,因为它非常明确。许多shell(包括bash)都包含一个内置函数,因此您不必担心进程创建的开销。

无论如何,我都会将您的测试重写为:

if test -r "$upFN" -a -f "$upFN"
then
  ...
fi

该语法将在传统的Bourne shell,Korn shell和Bash中工作。您也可以随便使用[语法。

09-26 06:52