我想创建一个 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
当我运行它时,我收到此错误:
./test.sh: line 1: [!: command not found
我的语法有什么问题吗?
答案1
您缺少一些空格,例如[!
必须[ !
并且"]
必须" ]
查看更正的代码:
#!/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
您的代码的另一种方式:
#!/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
答案2
[
和之间需要有一个空格!
才能正常工作。这是因为它[
是作为 shell 内置命令实现的(它甚至曾经是一个单独的可执行文件/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
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
编辑:感谢@LucianoAndressMartini 和@pabouk 的评论对我的理解进行了重要修正。