我正在尝试做一个简单的条件检查,但它似乎不起作用。如何在Shell脚本中执行逻辑或操作
如果$#
等于0
或大于1
那么打个招呼。
我曾尝试没有成功的语法如下:
if [ "$#" == 0 -o "$#" > 1 ] ; then
echo "hello"
fi
if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
echo "hello"
fi
我正在尝试做一个简单的条件检查,但它似乎不起作用。如何在Shell脚本中执行逻辑或操作
如果$#
等于0
或大于1
那么打个招呼。
我曾尝试没有成功的语法如下:
if [ "$#" == 0 -o "$#" > 1 ] ; then
echo "hello"
fi
if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
echo "hello"
fi
这应该工作:
if [ "$#" == 0 ] || [ "$#" -gt 1 ] ; then
echo "hello"
fi
我不知道这是在其他炮弹不同,但如果你想使用<,>,你需要把他们的双括号内像这样:
if (("$#" > 1))
...
我不确定它在另一个shell中是不同的,但在bash中,如果你希望使用>或<,你必须把它们放在双括号中,如下所示:((“$ a”<“$ b “)) – 2010-11-06 02:13:33
@Doug:并不是说unix不使用它们,而是我知道的bash和所有其他shell将它们用于输入/输出重定向。 – Cascabel 2010-11-06 02:28:31
使用'-eq'而不是'=='。 man test – 2010-11-07 14:24:20
你尝试过这样的事情:
if [ $# -eq 0 ] || [ $# -gt 1 ]
then
echo "$#"
fi
是的,我有。即使我有一个参数,它也会回应你。 – Strawberry 2010-11-06 02:04:21
与bash这适合我。 – 2010-11-08 15:54:10
此代码的工作对我来说:
#!/bin/sh
argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
echo "foo"
else
echo "bar"
fi
我不不认为sh支持“==”。使用“=”比较字符串和-eq来比较整数。
man test
了解更多详情。
什么是大于?什么时候的官方文件在哪里? – Strawberry 2010-11-06 02:07:02
应该是'-gt'大于。或者用'[$#-ne 1]'替换全部。 – mark4o 2010-11-06 02:08:12
大于-gt,看到我的答案。正如jbremnant指出的那样,官方文档正在进行人工测试。 – 2010-11-06 02:09:02
如果您使用bash退出代码状态$?为变量,这是更好地做到这一点:
if [ $? -eq 4 -o $? -eq 8 ] ; then
echo "..."
fi
因为如果你这样做:
if [ $? -eq 4 ] || [ $? -eq 8 ] ; then
的OR改变$的左边?变量,所以右边的OR不具有原始的$?值为。
$#返回传递给脚本的参数个数。用于检查正确的用法。它似乎不像提供者使用退出代码。在bash中使用 – Centimane 2015-08-19 11:53:32
从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}
你可以这样做:'[[-n $ A]] && echo 1 ||回声2' – 2017-01-16 01:19:17
@ premek.v感谢您的评论。我的回答是非常糟糕的解释,我只是编辑它,希望它能更多地了解这个话题。 – fedorqui 2017-01-16 09:57:33
有时你需要使用双括号,否则你会得到一个错误,如太多的参数
if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]
then
fi
他们都为我工作。你在* shebang *行中指定了一个shell吗? – 2010-11-06 02:02:53
@Jason我实际上已经忘记了shebang系列,但是我现在用它进行了测试,并没有奏效。 – Strawberry 2010-11-06 02:13:18
'>'是sh/bash中的输出重定向。现在你可能有一个名为'1'的文件。 – mark4o 2010-11-06 02:14:09