【问题标题】:What is the meaning of `! -d` in this Bash command?`是什么意思! -d` 在这个 Bash 命令中?
【发布时间】:2016-05-24 03:11:49
【问题描述】:

简单的问题,我不明白下面语句中的!-d 是什么意思。

if [ ! -d $directory ]

【问题讨论】:

  • [ 也是 test 命令,因此请阅读此内容,如“如果测试 NOT 目录 $dir”... 然后做一些事情。祝你好运。
  • aside:需要[ ! -d "$directory" ]才能正确;如果没有引号,如果您的目录名称包含空格或可以扩展为 glob,它将表现不佳。
  • 顺便说一句,下次遇到不理解的 shell 时,请尝试将其复制并粘贴到 explainshell.com 中(尽管在这种情况下,要么不带 if,要么添加; then : "something here"; fi 在最后使语法正确)。
  • 感谢explainshell.com。到目前为止,我只知道 shellcheck.net

标签: linux bash shell


【解决方案1】:

-d 是一个运算符,用于测试给定目录是否存在。

例如,我只有一个名为 /home/sureshkumar/test/ 的目录。

目录变量包含“/home/sureshkumar/test/”

if [ -d $directory ]

仅当目录存在时,此条件才成立。在我们的示例中,目录存在,因此该条件为真。

我将目录变量更改为“/home/a/b/”。 该目录不存在。

if [ -d $directory ]

现在这个条件是假的。如果我把!放在前面,如果目录不存在,那么if条件为真。如果目录确实存在,则if [ ! -d $directory ] 条件为假。

的操作!运算符是如果条件为真,则表示条件为假。如果条件为假,则表示条件为真。这是的工作!运算符。

if [ ! -d $directory ]

仅当 $directory 不存在时,此条件才成立。如果目录存在,则返回false。

【讨论】:

  • 请注意-d 测试也会失败,如果指定文件存在但它是一个常规文件,或者是其他更深奥的东西(FIFO、块特殊、字符特殊等)。如果名称是符号链接并指向目录,则通过;否则失败。
【解决方案2】:
  • ! 否定条件。
  • -d 选项检查 $directory 是否为目录。

【讨论】:

    【解决方案3】:

    -d 是 bash 中的测试运算符,当您将 ! 放在测试运算符之前 - 它的否定相同

    http://www.techtrunch.com/2011/11/25/test-operators-bash/

    【讨论】:

      【解决方案4】:

      括号是测试可执行文件,感叹号是否定,-d选项检查变量$directory是否是目录。

      来自man test

      -d FILE
             FILE exists and is a directory
      
      ! EXPRESSION
             EXPRESSION is false
      

      结果是一个 if 语句“如果 $directory 不是目录”

      【讨论】:

      • 好吧——字符串拆分和全局扩展变量directory的内容的结果是否命名为(单个)目录,而不是。如果您想在字面解释时检查这些内容是否与单个目录名称相对应,而不首先应用通配符或字符串拆分,则需要更多引号。
      【解决方案5】:

      ! 表示不是

      -d 表示测试目录是否存在

      所以,if [ ! -d $directory ] 表示$directory 不存在,或者 $directory 不是目录(可能是文件)。

      通常这后面会跟一个创建目录的语句,比如

      if [ ! -d $directory ]; then
        mkdir $directory
      fi
      

      【讨论】:

      • 如果您的目录已经作为文件存在,mkdir $directory 将无法正常工作。如果担心它是否根本不存在,mkdir -p "$directory" 没有预先测试是处理此案例的最佳实践成语。
      • ...相比之下,没有引用扩展名完全是错误的。如果分配了directory="My Documents",你运行mkdir $directory,你会创建两个目录,一个名为My,另一个名为Documents,而[ ! -d $directory ]等于[ ! -d "My" "Directory" ]——语法上无效,因为 -d 期望后面只有一个参数,而不是两个。
      猜你喜欢
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多