Re: [問題] shell scripts讀取外部傳進來的多項指令列

看板LinuxDev作者 (N=NP)時間16年前 (2009/02/15 19:24), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
在Bash中有個getopts 的指令, 是處理args時候萬用的solution。 當 getopts + while + case 一起交互配合的時候,就可以達到 Example 1. while getopts “ht:r:p:v” OPTION do case $OPTION in h) usage exit 1 ;; t) TEST=$OPTARG ;; r) SERVER=$OPTARG ;; p) PASSWD=$OPTARG ;; v) VERBOSE=1 ;; esac done 如果手中有一本蔣大偉編譯過的 Bash那本書,大概書中講的就是上面的範例。 若是以學習經驗上來說的話,從不會到會要了解 getopts 這個指令的話, 我是不太建議使用 while + getopts + case 一起學。 我到認為,先搞懂 while + getopts 的組合之後,就會明確搞懂getopts的用法。 接著再把case加進去,對於一個新手來說,就能夠對Example 1那類的code應用自如。 那麼以下是 while + getopts的範例 Example 2. while getopts "a:b:c:" flag do echo "$flag" IND=$OPTIND ARG=$OPTARG done 不過 Example 2. 並不是個完美的作法。 因為與getopts相關的全域變數是 $OPTIND。 我們也許有機會在 自己程式碼中實現 getopts。 但也許在我們自我實現的程式碼中,需要在未來一些結構化的考量。 因此getopts與結構化考量加一起的時候, 所以getopts 指令在使用時就要注意了。 以下的Example 可以看一下,這是我自己想的方法。 Example 3. function testGetOpts2 { local TMP_OPTIND=$OPTIND OPTIND=1 echo -e "\n+ testGetOpts2() $@" while getopts "a:b:c:" flag do echo "$flag" IND=$OPTIND ARG=$OPTARG done echo OPTIND=$OPTIND echo "" OPTIND=$TMP_OPTIND } 這麼作的好處在於, 我可以在function 之外作 getopts處理參數, 而case 中的寫法,也可以順利的來呼叫 testGetOpts2,而不會有問題。 實現的概念,就只是像堆碟一樣的push & pop. 個人是認為這樣子的作法比較好,以後程式擴大的時候,才不會出問題。 因為我對Bash接觸時間很短,我相信版上一定許多高手們, 知道比這更好方法 ^___^ 上面文字一堆落落長,就學習getopts來說, 僅需要學會 Example 2. ,然後再跨越 Example 1. 這樣子就 OK 了。 參數的處理getopts 之後,如果還能搭配 expr指令 就很棒了 ^^ ※ 引述《thecloud (另一種生活!!)》之銘言: : 不好意思,小弟是shell script新手一枚 : 最近在研究途中遇到一個問題,苦思不得其解,想說來此請教一下大家!~ : 狀況是我在C語言中,輸入一串指令列並寫到另一個檔案filename中儲存, : 指令列如右 ===> -D "aaa bbb ccc" : 然後我在shell script中,用了sed來讀進檔案filename中的那一行, : ex:第一行 `sed -n 1p filename` : 但是shell在執行時,卻會把指令列分別讀成 : -D : "aaa : bbb : ccc" : 所以shell執行時在這一段會產生錯誤, : 因為它會讀成"aaa,而不是aaa,然後把ccc讀成ccc" : 想請問各位的是, : 有辦法讓shell看的懂從外部讀取的 "aaa bbb ccc" 為一個多項的參數項嗎? : 因為我直接在shell上打 -D "aaa bbb ccc",shell是可以執行的。 : 我有試過用`sed|awk`這個方法, : 將 -D、aaa、bbb、ccc分別取出來並用雙引號將aaa、bbb、ccc包在一起, : 但是覺得沒辦法適用在格式較不固定的指令列,ex: -D "aaa bbb ccc" -d -v 1.1 : 想請教大家是否有比較好的方法, : 來讓shell看的懂外部傳來的指令哪是哪些是在一起的? 哪些是分開的? : 不知是否有人遇過類似的問題,麻煩高手們指教一下吧! 萬分感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.21.57 ※ 編輯: milochen 來自: 61.230.21.57 (02/15 19:25)
文章代碼(AID): #19b_jlAK (LinuxDev)
文章代碼(AID): #19b_jlAK (LinuxDev)