2011-06-02 43 views
1

擊4變量在Linux〜
我有可能的值的陣列。我必須將用戶輸入限制爲這些值。BASH:最佳的方式來設置從陣列

Arr=(hello kitty goodbye quick fox) 

用戶提供值作爲參數傳遞給腳本:

bash myscript.sh -b var 

目前,我嘗試以下:

function func_exists() { 
_var="$1" 
for i in ${Arr[@]} 
do 
    if [ "$i" == "$_var" ] 
    then 
     echo hooray for "$_var" 
     return 1 
    fi 
done 
    return 0 
} 

func_exists $var 
if [ $? -ne 1 ];then 
    echo "Not a permitted value." 
    func_help 
    exit $E_OPTERROR 
fi 

看起來工作得很好,在那裏爲測試用戶更好的方法輸入一個允許值的數組?

更新:我喜歡約翰·K公司的答案...有人可以明確使用$ @?我知道這代表所有的位置參數 - 所以我們將第一個參數從堆棧中移出,$ @現在代表了所有剩餘的參數,那些是傳遞的數組......這是正確的嗎?我討厭盲目使用代碼而不理解......即使它有效!

回答

1

你的解決方案是什麼,我會怎麼做。也許使用更多的shell-isms,比如返回0表示成功,非0表示像UNIX命令一樣失敗。

# Tests if $1 is in the array ($2 $3 $4 ...). 
is_in() { 
    value=$1 
    shift 

    for i in "[email protected]"; do 
     [[ $i == $value ]] && return 0 
    done 

    return 1 
} 

if ! is_in "$var" "${Arr[@]}"; then 
    echo "Not a permitted value." >&2 
    func_help 
    exit $E_OPTERROR 
fi 

小心使用雙引號確保即使單個數組條目包含允許的空格也能工作。這是一個雙元素數組:list=('hello world' 'foo bar')

+0

不錯的改進!謝謝!除了進一步的輝煌,這將得到我的投票。 – Bubnoff 2011-06-02 02:52:11

+0

我對函數中$ @的理解:將第一個arg移出堆棧 - $ @現在代表餘數。它是否正確? – Bubnoff 2011-06-02 02:58:13

+0

@Bubnoff是的,沒錯。 – 2011-06-02 12:58:06

1
function func_exists() { 
    case "$1" 
    in 
    hello) 
    kitty) 
    goodbye) 
    quick) 
    fox) 
     return 1;; 
    *) 
     return 0;; 
    esac 
} 
+0

對於down-voter:對不起,你看到我的答案,因爲我錯誤地提交了它,因爲錯誤的鍵。 :) – 2011-06-02 02:31:06

+0

這是一個很好的解決方案,但我不確定如果允許的輸入數組包含50-100個成員,它將會是多麼可讀。 – Bubnoff 2011-06-02 02:40:17

+0

也可以用'hello | kitty | goodbye | quick | fox]緊湊地寫成''。 – 2011-06-02 02:41:25

1

另一種解決方案。 is_in只是一個變量:

Arr=(hello kitty goodbye quick fox) 

var='quick' 

string=" ${Arr[*]} "       # array to string, framed with blanks 
is_in=1           # false 
# try to delete the variable inside the string; true if length differ 
[ "$string" != "${string/ ${var} /}" ] && is_in=0 

echo -e "$is_in" 
+0

偉大的解決方案。謝謝!我會保留這個以備後用。 – Bubnoff 2011-06-02 22:23:47