2012-02-16 174 views
1

我需要傳遞一個字符串值myscript.sh 含有間隔爲選項的代碼如下所示:getopts的截斷參數值

while getopts "m:i:t:" OPTION 
do 
case $OPTION in 
    m) 
     M=$OPTARG 
     echo M: $M 
     ;; 
    i) 
     I=$OPTARG 
     echo I: $I 
     ;; 
    t) 
     T=$OPTARG 
     echo T: $T 
     ;; 
    ?) 
     usage 
     exit 
     ;; 
esac 
done 

,當我直接調用它的命令行上它工作得很好:

./myscript.sh -m 1 -i '0 1 2 3' -t '2142' 
M: 1 
I: 0 1 2 3 
T: 2142 

但是,我需要傳遞-i作爲字符串變量,我無法讓它工作。選項-i的字符串被截斷,選項-t甚至不會通過(可能是新行)。

I='0 1 2 3' 
./myscript.sh -m 1 -i "'"$I"'" -t '2142' 
M: 1 
I: '0 

I='0 1 2 3' 
II="'"$(echo $I)"'" 
./myscript.sh -m 1 -i $II -t '2142' 
M: 1 
I: '0 

有什麼建議嗎?謝謝!

回答

3

爲什麼當你試圖運行它時會這樣引用?這一點我敢肯定,這就是你的意思做:

./myscript.sh -m 1 -i "$I" -t 2142 

雙引號把所有的字符在他們裏面的文字,除了幾件事情,包括$,它允許變量進行擴展。單引號也停止變量擴展。它們各自保護另一種類型的報價,因此"'"只是一個'字符,而'"'只是一個"字符。

這意味着"'"$I"'"變爲'0 1 2 3',對於單引號沒有特殊含義,也沒有對空格的保護 - 您也可以將它寫爲\'0 1 2 3\'。這些空間不受保護,將文字分開,因此第一個詞是\'0。因此,您的腳本將該值視爲選項的值,並且1,23'作爲額外參數。如果在while循環之後添加shift $((OPTIND - 1))以移除解析的選項,然後在選項解析後添加echo "arguments: [email protected]",則可以看到此內容。你也會看到,因爲getops期望所有選項一起在前面,這導致你錯過了-t選項,也將它當作一個參數。

+0

+1你說得對,我錯過了那個,嘿。我標記爲我被刪除,因爲它是錯誤的。 – jmq 2012-02-16 18:34:06

+0

謝謝! (我真的認爲我試過....唉)很好的解釋。 – magicalo 2012-02-16 19:27:33

+1

很高興能幫到你!聽起來就像你有良好的直覺,至少:如果你看到空間分裂的東西,這可能是一個引用問題。 – Cascabel 2012-02-16 20:13:58