2011-09-16 37 views
0

數組,並列出了Bourne Shell中

read input 
case "$input" in 
    "list"*) 
     blah 
     ;; 

    "display"*) 
     blah 
     ;; 

    "identify"*) 
     blah 
     ;; 

    "rules"*) 
     perl image.pl $input[1] 
     ;; 

    "quit") 
     echo "Goodbye!" 
     ;; 

    *) 
     echo -n "Error, invalid command. " 
     ;; 

esac  

我試圖找出如何通過$輸入的值,而不包括在輸入字符串「規矩」 image.pl代碼。

即,如果用戶輸入'rules -h',我只想將'-h'傳遞給image.pl。

與我的其他案例類似,我想特別測試是否有任何其他參數傳入輸入,例如,對於「退出」,我想測試用戶是否說'退出x'並拋出'退出'不接受任何其他「參數」的特定錯誤。

謝謝。

+2

你的意思的Bourne shell或Bash?這方面的能力完全不同。值得注意的是,Bourne Shell不包含數組。 –

回答

4

假設你使用的是Bourne shell作爲標題註明:

read input 
set -- $input 
case "$1" in 
    list) 
     blah 
     ;; 

    rules) 
     perl image.pl "$2" 
     ;; 
esac 
+0

謝謝,這正是我正在尋找的。我會在3分鐘內接受你的答案。 – gbhall

+2

您也可以使用「shift」內置命令刪除$ 1,$ 2,..數組中的第一個元素。然後,只需將「$ *」傳遞給perl腳本($ *就是整個$ 1,$ 2,..數組)。底線是,sh只支持*一個*數組。 – nimrodm

+1

@nimrodm:除非你特別想讓shell壓縮任何特殊的引用,否則你應該更喜歡''$ @'''通過''$ *''。你仍然得到我的+1。 – tripleee

1

您可以使用$input變量初始化在bash的數組,這裏是代碼:

read input 
declare -a arr=($input) 
case "${arr[0]}" in 
    "list") 
     blah 
     ;; 
    "display") 
     blah 
     ;; 
    "identify") 
     blah 
     ;; 
    "rules") 
     shift 
     perl image.pl ${arr[1]} 
     ;; 
    "quit") 
     echo "Goodbye!" 
     ;; 
    *) 
     echo -n "Error, invalid command. " 
     ;; 
esac