2017-10-13 119 views
0

的下面while循環我的一個殼中存在稱作test.shUNIX - getopts的多個開關

我想運行下面的命令

ksh的-x test.sh -c -e文件1文件2

我想while循環的循環中執行這兩個C)情況下,第一則E)的情況下,但目前它只是在執行C)的情況下

有人能告訴我如何得到它來執行都?第一批C類),那麼E)

while getopts ":c:e:" opt; do 
    case $opt in 
     c) 
      gzip -9 archivedfile 
      ;; 
     e) 
      ksh test2.sh archivedfile 
      ;; 
    esac 
    shift 
done 

回答

0

使用;&

case c in 
     c) 
      echo got c 
      ;& 
     c|e) 
      echo got c or e 
      ;; 
esac 

看到基於您的示例腳本調用man ksh

If ;& is used in place of ;; the next subsequent list, if any, is executed.

+0

我試過,但我得到一個錯誤: – DaveMac001

+0

語法錯誤在行xx:'&'意想不到 – DaveMac001

+0

張貼塊的作品。其他版本? 'ksh --version' is'sh(AT&T Research)93u + 2012-08-01'('ksh93') – toting

2

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」
從命令行,這意味着讀取的任何更多的項目...