2010-11-06 63 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