5

所以基本上我正在尝试检查传递给脚本的参数。如果它有三个参数并且第三个参数是 1,那么我希望它继续。如果它有四个参数并且第三个参数不是 1,我也希望它继续。

所以基本上我认为我可以做...

if ([ $# -ne 3 ] and [ "$3" -ne "2" ])
then
exit 0
fi

但是,似乎 Bash 没有并且可以用于 if,所以我想我可以只使用嵌套的 if,但是现在它仍然在抱怨。所以这就是我目前所拥有的......

if [ $# -ne 3 ]
then
if [ "$3" -ne "1" ]
then

echo "Improper number of arguments.
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT>

Select can be left off if you want all data (Mode=1)
"
exit 0

fi
fi
if [ $# -ne 4 ]
then
if [ "$3" -ne "2" ]
then

echo "Improper number of arguments.
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT>

Select can be left off if you want all data (Mode=1)
"
exit 0

fi
fi

那么我哪里错了?我不能在 Bash 中嵌套 if 语句吗?有没有一种我完全错过的超级禅宗方式?

感谢您能给我的任何帮助。


新问题...

现在,由于某种原因,代码根本不起作用。没有错误或任何东西,它只是不起作用。它不检查参数的数量。我已经完全没有参数地运行了脚本,它只是跳过它,就像它甚至不存在一样。

奇怪的是,我确信代码昨天还在工作。今天回来,不多说了。关于问题是什么的任何想法?(对不起,但我必须删除已接受的答案。)

if [[ $# = 3 && "$3" != "1" ]]
then

echo "Improper number of arguments.
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT>

Select can be omitted if all data is required (Mode=1)
"
exit 0

fi

if [[ $# > 4 ]]
then

echo "Improper number of arguments.
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT>

Select can be omitted if all data is required (Mode=1)
"
exit 0

fi

编辑二:

Bash shell 不喜欢我正在尝试做的这个脚本的一些事情。我可能最终会用另一种脚本语言重写它,并为该项目做一些我想到的更多事情。无论如何感谢您的帮助。

4

2 回答 2

19
if [ $# -ne 3 -a "$3" -ne "1" ]; then
  exit 0
fi

以供参考

-a = and
-o = or

或者,您可以只使用:

if [[ $# != 3 && "$3" != "1" ]]; then
于 2009-05-26T15:48:03.303 回答
2

请参见:

http://bash-hackers.org/wiki/doku.php/commands/classictest#and_and_orhttp://bash-hackers.org/wiki/doku.php/syntax/ccmd/conditional_expression

由于您只是用“if”检查退出/返回值,因此您需要提供一些东西,例如一个命令,它会根据您的测试提供有意义的东西。[ 就是这样一个命令,另一种可能是 [[ 关键字。

上面的scragar已经提到了实际正确的例子,我不想重复它们:)

于 2009-05-26T16:57:37.157 回答