0
#! /bin/bash

if [ !\(-f new.bash -o -d new.bash\) ]
then
    echo "Neither"
else
    echo "yes"
fi

它可以工作,但会出现错误:

/file_exist_or_not.bash      
./file_exist_or_not.bash: line 3: [: too many arguments
yes

顺便说一句,为什么需要转义内括号?

4

2 回答 2

3

Bash 使用空格来分隔标记,然后将它们作为参数传递给命令(在这种情况下,命令是test)。有关更多详细信息,请参见手册页test

要解决,您需要在操作数之间添加空格。

if [ ! \( -f new.bash -o -d new.bash \) ]
于 2012-10-04T09:39:58.737 回答
2

如果您正在使用bash并且不介意放弃 POSIX 兼容性,则以下内容会更简单一些:

if [[ ! ( -f new.bash || -d new.bash ) ]]; then

您可以使用||而不是-o,括号不需要转义。

于 2012-10-04T14:21:08.123 回答