我正在嘗試做一個簡單的條件檢查,但它似乎不起作用。如何在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