Bash 检查文件是否可读并存在于一个if条件中:if[-r-f";/file.png";]

Bash 检查文件是否可读并存在于一个if条件中:if[-r-f";/file.png";],bash,if-statement,debian,Bash,If Statement,Debian,我正在编写一个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: syn

我正在编写一个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]
测试expr
。C风格<代码>&<代码> >代码> <代码>仅包含在BASH中,因此您可能需要考虑使用<代码> -<代码> >和<代码> -O >代码>。就我个人而言,我更喜欢使用
testexpr
,因为它非常明确。许多shell(包括bash)都包含一个内置的shell,因此您不必担心进程创建开销

在任何情况下,我都会将您的测试改写为:

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

这种语法将在传统的BourneShell、KornShell和Bash中使用。您可以使用
[
语法也可以移植。

-r
检查可读性,
-f
检查存在的文件。
-r
部分可能会成功找到一个目录,
-f
将失败。帖子没有提到
-f
要求该项是一个文件。
-e
检查是否存在。I thoug如果文件不存在,-f和-r将永远不会成功,也从来没有听说过-e,将不得不检查这个人。我刚刚意识到,有一种情况,
-r
是正确的,
-f&&r
不是:对于可读目录。是的,@Oliv。这就是D.Shawley指出的-
-f
-e>之间的区别
。我不认为这是一个重要的区别,因为我认为Mint一直认为
-f
的行为就像
-e
。也就是说,我认为最初使用
-f
是一个错误。我认为这意味着文件可能存在,但您可能没有读取权限。例如:
/var/log/secure
-f
代表文件,
-d
代表目录。哎呀,标题中没有/folder/:PI一直认为[[expr]]在使用变量时比[expr]更安全。我不知道| |和&&只在bash中起作用,从现在开始会像你建议的那样使用-a-o。干杯什么时候应该使用bash的特定功能?