Bash脚本中的参数检查问题

时间:2009-05-26 15:38:12

标签: bash scripting if-statement arguments

所以基本上我试图检查传递给脚本的参数。如果它有三个参数而第三个参数是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

编辑II:

有一些事情是Bash shell不喜欢我正在尝试做的这个脚本。我可能最终会用另一种脚本语言重写它,并为项目做一些我想到的事情。在任何情况下都要感谢您的帮助。

2 个答案:

答案 0 :(得分:19)

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

供参考

-a = and
-o = or

或者,你可以使用:

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

答案 1 :(得分:2)

请参阅:

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

由于您只是使用“if”检查退出/返回值,因此您需要提供一些内容,例如一个命令,根据您的测试提供有意义的命令。 [是这样的命令,另一种可能性是[[keyword。

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