:
ksh -x test.sh -c -e file1 file2
- 的「-c」選項確實不有一個說法
- 的「-e」選項不有一個參數(即「文件1」)
如果是這種情況,請嘗試在getopts
選項字符串去掉字母「C」後的冒號(:
),例如:
while getopts ":ce:" opt; do
如果這能解決您的問題...請繼續閱讀了解更多詳情...
當冒號(:
)跟隨在getopts
選項字符串的信,這表示該選項有一個參數,這反過來又意味着OPTARG將被設置爲從所述命令行讀取下一個項目。
如果getopts
選項字符串中的字母后沒有冒號,則表示該選項沒有參數,這意味着OPTARG將被取消設置。
我們可以看到此行爲與下面的示例腳本:
對於我們期待我們的每一個選項(C,E)後的參數這第一個腳本 - 後注意冒號(:
)在getopts
選項字符串每個字母(C,E):
$ cat test1.sh
#!/bin/ksh
while getopts :c:e: opt
do
case $opt in
c) echo "c: OPTARG='${OPTARG:-undefined}'" ;;
e) echo "e: OPTARG='${OPTARG:-undefined}'" ;;
*) echo "invalid flag" ;;
esac
done
幾個試驗運行:
$ test1.sh -c -e file1
c: OPTARG='-e'
- 因爲我們的'c'選項/標誌後跟一個冒號(c :),'-e'被視爲'-c'選項的參數;因爲「-e」在這個穿過
getopts
消耗...
- 沒有更多的選項標誌來處理,因此
getopts
情況下爲「E」選項是從來沒有訪問
$ test1.sh -c filex -e file1
c: OPTARG='filex'
e: OPTARG='file1'
- 因爲我們提供了一個參數爲我們的選項/標誌(C,E),我們認爲這是期望
現在兩個getopts
箱子進行處理,如果我們不希望「-c '選項有一個參數,那麼我們需要刪除冒號(:
)後面的字母「C」在我們getopts
選項字符串:
$ cat test2.sh
#!/bin/ksh
while getopts :ce: opt
do
case $opt in
c) echo "c: OPTARG='${OPTARG:-undefined}'" ;;
e) echo "e: OPTARG='${OPTARG:-undefined}'" ;;
*) echo "invalid flag" ;;
esac
done
$ test2.sh -c -e file1
c: OPTARG='undefined'
e: OPTARG='file1'
- ,因爲我們的「C」選項/標誌不跟一個冒號,
getopts
不爲下一次通過getopts
的「-e」選項/標誌被處理並OPTARG被設置爲「文件1」
從命令行,這意味着讀取的任何更多的項目...
我試過,但我得到一個錯誤: – DaveMac001
語法錯誤在行xx:'&'意想不到 – DaveMac001
張貼塊的作品。其他版本? 'ksh --version' is'sh(AT&T Research)93u + 2012-08-01'('ksh93') – toting