【问题标题】:Checking if a file is readable and exists in one if condition: if [[ -r -f "/file.png" ]]检查文件是否可读且是否存在于一个 if 条件:if [[ -r -f "/file.png" ]]
【发布时间】:2011-01-11 03:10:09
【问题描述】:

我正在编写一个 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'

【问题讨论】:

  • -f 用于文件,-d 用于目录。
  • 糟糕,标题中不包含 /folder/ :P

标签: bash if-statement debian


【解决方案1】:

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

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

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

该语法适用于传统的 Bourne shell、Korn shell 和 Bash。您也可以使用可移植的 [ 语法。

【讨论】:

  • 我一直认为 [[ expr ]] 在使用变量时比 [ expr ] 更安全。我不知道||并且 && 仅在 bash 中有效,从现在开始将按照您的建议使用 -a -o 。干杯
  • 那么什么时候应该使用 Bash 特有的功能呢?
【解决方案2】:

是否存在文件可读但存在的情况?当可读性告诉你所有你需要的时候,不要费心检查是否存在。

【讨论】:

  • -r 检查可读性,-f 检查存在的文件。对于目录,-r 部分可能会成功,而 -f 将失败。该帖子没有提到-f 要求该项目是一个文件。 -e 检查是否存在。
  • 我以为文件不存在的话-f和-r永远不会成功,没听说过-e,就得查man了。
  • 我刚刚意识到,存在-r <file> 为真而-f <file> && -r <file> 不为真的情况:对于可读目录。
  • 是的,@Oliv。这就是 D. Shawley 所指出的——-f-e 之间的区别。在这种情况下,我认为这不是一个重要的区别,因为我认为 Mint 一直认为 -f 的行为就像 -e 一样。也就是说,我认为原来使用-f是一个错误。
  • 我认为该文件可能存在,但您可能没有读取权限。例如:/var/log/secure.
猜你喜欢
  • 2023-01-02
  • 2010-11-25
  • 1970-01-01
  • 2021-09-05
  • 2015-01-30
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多