Shell 脚本:如果有多个条件

Hen*_*ley 7 shell scripting shell-script

我想创建一个 shell 脚本,如果 3 个目录不存在,则该脚本会回显某些内容。

这是我写的代码:test.sh:

if [ ! -d "/home/unix/POSTagger2" ] || [! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09"] || [! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09"]; then
echo "Nope"
fi
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到此错误:

./test.sh: line 1: [!: command not found
Run Code Online (Sandbox Code Playgroud)

我的语法有什么问题?

Luc*_*ini 15

您缺少一些空格,例如[!必须[ !并且"]必须" ]查看更正后的代码:

#!/bin/bash
if 
[ ! -d "/home/unix/POSTagger2" ] || 
[ ! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" ] || 
[ ! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09" ] 
then
      echo "Nope"
fi
Run Code Online (Sandbox Code Playgroud)

代码的另一种方式:

#!/bin/bash
for dir in "/home/unix/POSTagger2" "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09"; do
     if [ ! -d "$dir" ]; then echo nope ; break; fi 
done  
Run Code Online (Sandbox Code Playgroud)


Sat*_*hra 9

您需要在[和之间留一个空格!才能正常工作。这是因为它[是作为 shell 内置命令实现的(它甚至曾经是一个单独的 exectuable /usr/bin/[)。

您还可以使用:

if [ ! -d "/home/unix/POSTagger2" -o ! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" -o ! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09") ] ; then
    echo "Nope"
fi
Run Code Online (Sandbox Code Playgroud)

Bash 提供了一种[[作为 en 表达式实现的替代方案。[[使用&&,||等代替-a,-o作为运算符。

if [[ ! (-d "/home/unix/POSTagger2" && -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" && -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09") ]] ; then
    echo yes
fi
Run Code Online (Sandbox Code Playgroud)

编辑:感谢@LucianoAndressMartini 和@pabouk 对我理解的重要更正。

  • 它是 bash 中的内置命令,但它的作用类似于任何命令并且需要空格的事实仍然适用。 (3认同)