2010-11-06 76 views
390

我正在尝试做一个简单的条件检查,但它似乎不起作用。如何在Shell脚本中执行逻辑或操作

如果$#等于0或大于1那么打个招呼。

我曾尝试没有成功的语法如下:

if [ "$#" == 0 -o "$#" > 1 ] ; then 
echo "hello" 
fi 

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then 
echo "hello" 
fi 
+0

他们都为我工作。你在* shebang *行中指定了一个shell吗? – 2010-11-06 02:02:53

+1

@Jason我实际上已经忘记了shebang系列,但是我现在用它进行了测试,并没有奏效。 – Strawberry 2010-11-06 02:13:18

+15

'>'是sh/bash中的输出重定向。现在你可能有一个名为'1'的文件。 – mark4o 2010-11-06 02:14:09

回答

683

这应该工作:

if [ "$#" == 0 ] || [ "$#" -gt 1 ] ; then 
echo "hello" 
fi 

我不知道这是在其他炮弹不同,但如果你想使用<,>,你需要把他们的双括号内像这样:

if (("$#" > 1)) 
... 
+2

我不确定它在另一个shell中是不同的,但在bash中,如果你希望使用>或<,你必须把它们放在双括号中,如下所示:((“$ a”<“$ b “)) – 2010-11-06 02:13:33

+1

@Doug:并不是说unix不使用它们,而是我知道的bash和所有其他shell将它们用于输入/输出重定向。 – Cascabel 2010-11-06 02:28:31

+14

使用'-eq'而不是'=='。 man test – 2010-11-07 14:24:20

6

你尝试过这样的事情:

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then 
echo "$#" 
fi 
+0

是的,我有。即使我有一个参数,它也会回应你。 – Strawberry 2010-11-06 02:04:21

+0

与bash这适合我。 – 2010-11-08 15:54:10

43

此代码的工作对我来说:

#!/bin/sh 

argc=$# 
echo $argc 
if [ $argc -eq 0 -o $argc -eq 1 ]; then 
    echo "foo" 
else 
    echo "bar" 
fi 

我不不认为sh支持“==”。使用“=”比较字符串和-eq来比较整数。

man test 

了解更多详情。

+0

什么是大于?什么时候的官方文件在哪里? – Strawberry 2010-11-06 02:07:02

+3

应该是'-gt'大于。或者用'[$#-ne 1]'替换全部。 – mark4o 2010-11-06 02:08:12

+0

大于-gt,看到我的答案。正如jbremnant指出的那样,官方文档正在进行人工测试。 – 2010-11-06 02:09:02

25

如果您使用bash退出代码状态$?为变量,这是更好地做到这一点:

if [ $? -eq 4 -o $? -eq 8 ] ; then 
    echo "..." 
fi 

因为如果你这样做:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then 

的OR改变$的左边?变量,所以右边的OR不具有原始的$?值为

+1

$#返回传递给脚本的参数个数。用于检查正确的用法。它似乎不像提供者使用退出代码。在bash中使用 – Centimane 2015-08-19 11:53:32

1

Bash Reference Manual → 3.4.2 Special Parameters


($#)扩展为十进制位置参数的数目。

因此,$#将始终为0或更大的整数。

所以,如果你想要做的事,每当$#大于1 0或者,你只需要检查是否$#是或不是1

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1" 

它使用的语法:

[ condition ] && {things if true} || {things if false} 
+0

你可以这样做:'[[-n $ A]] && echo 1 ||回声2' – 2017-01-16 01:19:17

+0

@ premek.v感谢您的评论。我的回答是非常糟糕的解释,我只是编辑它,希望它能更多地了解这个话题。 – fedorqui 2017-01-16 09:57:33

12

有时你需要使用双括号,否则你会得到一个错误,如太多的参数

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]] 
    then 
fi