2016-09-15 18 views
0
isCat() [[ $word = "cat" ]] 
isDog() [[ $word = "dog" ]] 
isFish() [[ $word = "fish" ]] 
isAny() { if isCat || isDog || isFish; then return 0; else return 1; fi } 

我想簡化「isAny」功能類似:簡化慶典with語句或運營商

isAny() [[ isCat || isDog || isFish ]] 

,但我沒有找到如何。上述嘗試不正確,因爲當所有其他函數評估爲false時,「isAny」爲真。我以這種方式使用這些函數:

if isCat; then 
    echo "cat" 
fi 
if isAny; then 
    echo "any" 
fi 
+1

從文體的角度來看,大寫功能名稱是非常不尋常的。函數定義了命令,並且命令在UNIX上通常不是全部大寫的。 –

+0

'[[IS_CAT || IS_DOG || IS_FISH]]',順便說一句,完全等同於[[-n IS_CAT ||] -n IS_DOG || -n IS_FISH]]'或'[-n「IS_CAT」] || [-n「IS_DOG」] || [-n「IS_FISH」]:它檢查字符串「IS_CAT」是否非空(或字符串「IS_DOG」非空,或字符串「IS_FISH」非空) - 始終爲真(自'IS_CAT'是一個由6個字符組成的字符串,因此*從不*爲零字符/空字符串),與運行名爲'IS_CAT'的函數完全不同。 –

+0

我使用全部大寫字母,因爲它使得它更容易查看,因此可以在我的腳本中讀取。我應該用這個命名約定來解決這個問題...... – Alan

回答

3

原因

isAny() [[ isCat || isDog || isFish ]] 

...永遠是真實的,即使函數都返回假的,就是它的檢查"isCat""isDog""isFish"是否非空字符串 - 這當然是他們總是 - 而不是將它們作爲功能運行。


如果你從字面上試圖做對幾個固定令牌的比較,case說法是這樣做的傳統(和POSIX兼容)的方式:

case $word in 
    cat|dog|fish) return 0;; 
    *) return 1;; 
esac 

這就是說,如果這是一個nonliteral的例子:

isAny() { isCat || isDog || isFish; } 

...是最簡單的方法來編寫你的功能。因爲它不在[[ ]]中,所以它實際上運行的是shell命令(您定義的函數),而不是將內容解釋爲擴展的 - test語法。

2

shell函數將返回它運行的最後一個命令的退出狀態。因此...

IS_ANY() { IS_CAT || IS_DOG || IS_FISH; } 

將做的伎倆。