LinuxDev 板


LINE

在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)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP