2011-01-28 57 views
2

我想讓字符串中有空白的地方被計爲整個字符串,而不是被解析。這是我想有什麼情況:計算KSH中參數的空白?

$ ksh program.ksh "what up" 
File 'what up' not found. 

而這就是我得到:

$ ksh program.ksh "what up" 
File 'what' not found. 
File 'up' not found. 

這是我試圖使代碼工作:

wflag=false 
cflag=false 

while getopts "cw" opt; do 
    case "$opt" in 
    c) 
     cflag=true 
     ;; 
    w) 
     wflag=true 
     ;; 
    /?) 
     ;; 
    esac 
done 

問題在於:1)我嘗試上面的內容,如ksh program.ksh "what up"; 2)當我嘗試類似ksh program.ksh "-w -c"時。第二個是最令人困惑的,因爲當我打印出wflagcflag他們都是真實的。 "-w -c"不應該被當作字符串嗎?看起來好像內核(它是內核在這裏做的工作?)正在解析這個,儘管那正是我不想要的;我希望它被視爲一個帶有空格的字符串。我已經通過WordSplitting和((論文中的論點,雖然不會讓我發佈))和認爲我明白了。很明顯,我必須錯過一些東西,或者畢竟沒有真正理解它:P

我的直覺告訴我,getopts會自動消除任何空白。我試過$(opt)而不是"$opt",以及花括號和/或單引號(我很確定單引號不是什麼會工作,雖然)。唉,沒有雪茄。

任何幫助將不勝感激,並感謝您通過閱讀這段文字。

回答

2

case語句中的最後一項應該有反斜槓而不是斜槓。爲了進行診斷,我們再做一些其他更改,以便了解發生了什麼。

#!/bin/ksh 
wflag=false 
cflag=false 

# the first colon means suppress error messages 
# the colon after the x means that -x requires an argument 
while getopts ":cwx:" opt 
do 
    echo "opt $opt" 
    case "$opt" in 
     c) 
      cflag=true 
      ;; 
     w) 
      wflag=true 
      ;; 
     x) 
      echo "x is an option, $OPTARG is its argument" 
      ;; 
     \?) 
      echo "invalid option" 
      ;; 
     *) 
      echo "missing argument" 
      ;; 
    esac 
done 
echo "cflag $cflag" 
echo "wflag $wflag" 

現在,讓我們把它幾個方面:

$ ./script.ksh -c 
opt [c] 
cflag true 
wflag false 

精細。

$ ./getoptstest.ksh -c -w 
opt [c] 
opt [w] 
cflag true 
wflag true 

還行。

$ ./getoptstest.ksh -cw 
opt [c] 
opt [w] 
cflag true 
wflag true 

還不錯,但我們的回答是預示。

$ ./getoptstest.ksh '-c -w' 
opt [c] 
opt [?] 
invalid option 
opt [?] 
invalid option 
opt [w] 
cflag true 
wflag true 

現在我們正在某個地方。 Korn shell中man頁說:

一家領先的:在optstring導致getopts的存儲的 在OPTARG無效選項的字母,並集VNAME什麼?對於 未知選項和:當所需的選項參數未命中時- ing。否則,getopts將打印一條錯誤消息。

正如你可以從例如這最後一個之前看到的,你可以在-cw運行選項在一起。當您通過'-c -w'這樣的選項時,getopts將其視爲-c-space---w。因此,除了兩個無效選項(---space)也同時看到-c-w,這就是爲什麼標誌越來越設定。如果沒有領先的冒號(這是原始腳本張貼在問題的方式),你應該得到這樣的錯誤信息:

./script.ksh: - : unknown option 
./script.ksh: --: unknown option 

如果你仔細觀察,你會發現搬弄是非的空間和更多的破折號。

不幸的是man頁面沒有討論getopts處理單獨傳遞或聚集在一起的參數的能力。

我不確定我是否理解您的ksh program.ksh "what up"示例中存在什麼問題。

嘗試使用這些選項和參數修改我的腳本,以查看其餘部分的工作原理。

./script.ksh -x 
./script.ksh -x foo 
./script.ksh -z 
./script.ksh -c bar -w 

最後一個是棘手的。如果找到不以短劃線開頭的參數,並且前面的選項不帶參數,則getopts將停止處理,其餘參數將保留原位。您可以在while循環之後使用shift $(($OPTIND - 1)),然後您將能夠以通常方式訪問其餘的位置參數。

不幸的是,shell內置的getopts不能處理像--version這樣的長選項。外部工具getopt的確如此,但是在使用時可能會遇到一些問題。

+0

非常感謝您提供瞭如此明確且有幫助的回覆。不幸的是,`getopts`不支持長期選項,我想我可能需要找到另一種方法來實現這一點。我會嘗試將所有參數存儲到一個數組中,然後逐個處理它們。再次感謝您的幫助! – Fred 2011-01-28 19:03:53