检查文件在Bash中是否具有与644不同的权限

时间:2016-12-12 11:42:55

标签: bash if-statement file-permissions

如果文件的权限与644不同,我必须将文件的权限更改为644。

我想过这样的事情:

if [ $(stat -c %A $soubor) ! -eq (-rw-r--r--) ];then...

但是,它会出现如下错误:

  

预期的整数表达式

或者如果我稍微修改一下,那么:

  

语法错误):

1 个答案:

答案 0 :(得分:1)

您使用[错误。它与test相同,因此man test为您提供了手册页。 基本上,[是一个用参数调用的程序。为了获得更好的外观,[要求最后一个参数为],但没有技术原因。

当您致电[ $a == $b ]时,它会失败,因为[会将$a=进行比较,并会抱怨它不期望的$b。因此,如果您要开发符合POSIX标准,则需要使用=代替==

-eq执行数字比较,因此-rw-r--r--会导致语法错误,因为它不是数字。

=将进行字符串比较,因此这就是您所需要的。

您将与(-rw-r--r--)进行比较,这将作为命令进行评估,因此您需要在其周围添加引号(请参阅我对您的问题的评论,我使用了八进制语法)。

此外,您需要移除大括号,使其变为'-rw-r--r--'。我假设您添加了它们,因为它们位于if语句的左侧。 左边括号的原因是命令执行。当您将某些内容包装到$()中时,它将被执行并且命令的输出将在那里填充。所以在shell评估表达式之后,它看起来像这样:

'[' '-rw-rw-rw-' '=' '-rw-r--r--' ']'

当您在shell脚本中的任何位置使用set -x时,您可以看到它实际上有什么帮助。之后您可以使用set +x禁用它,因为它非常详细。