为什么shell脚本给我一个太多的参数错误?

时间:2012-10-04 09:35:35

标签: bash shell

#! /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

BTW,为什么内部括号需要被转义?

2 个答案:

答案 0 :(得分:3)

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

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

if [ ! \( -f new.bash -o -d new.bash \) ]

答案 1 :(得分:2)

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

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

您可以使用||代替-o,并且不需要转义括号。