2017-06-29 43 views
0

需要小解釋:爲什麼這樣做不起作用?檢查傳遞的參數是否等於bash腳本中的字符串

#!/bin/bash 

ker=$1 
if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then 
printf " allowed kernels: iso, om, constbeta \n" 
exit 
fi 
wait 
echo 'anisotropy kernel: ', "$ker" 

我也曾嘗試

#!/bin/bash 

ker="$1" 
if [ $ker != "iso" ] || [ $ker != "om" ] || [ $ker != "constbeta" ] ; then 
printf " allowed kernels: iso, om, constbeta \n" 
exit 
fi 
wait 
echo 'anisotropy kernel: ', "$ker" 

我這樣稱呼它:$ ./script.sh iso
,我甚至已經試過這樣的(雖然我認爲這並沒有什麼意義與上面的 腳本):$ ./script.sh "iso"
我總是得到allowed kernels: iso, om, constbeta
非常感謝那些可以發現錯誤的人。

回答

1

因爲邏輯或||,您應該使用和&&否則條件總是正確的想法否定字符串不能等於三個值。

1

你有一種非理性的狀態...

if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then 

如果$ker是「ISO」,那麼它是不是「嗡」的條件匹配。如果$ker是「om」,那麼它不是「iso」並且條件匹配。你想要的是或者一個正面檢查的清單,並有一個「其他」的條件,而不是負面的檢查。

if [ "$ker" = "iso" ] || [ "$ker" = "om" ] || [ "$ker" = "constbeta" ] ; then 
    : do something useful 
else 
    : report error 
fi 

或者,因爲你在bash的時候,你可以使用一個 「簡單」 的條件:如果你喜歡,你可以使用其他結構

if [[ "$ker" =~ ^(iso|om|constbeta)$ ]]; then 

雖然:

case "$ker" in 
    iso|om|constbeta) 
    : this catches our "good" values 
    ;; 
    *) 
    echo "Error" >&2 
    exit 1 
    ;; 
esac 

這具有符合POSIX標準的可能優點。

+0

我明白了。謝謝你們倆。 ps:你的第二個建議不起作用,但是我會想到我們的 – andrea

+0

@andrea - Varsågod,這就是我們在這裏所做的。 :)第二個建議做什麼而不是工作?你有錯誤嗎? – ghoti

+0

不,它的工作原理。它只是不按我想的方式工作(即相反)。我仍然需要學習bash格式化語法,我只是從來沒有時間。 taksåmycket! – andrea

相關問題