Re: [問題] shell scripts讀取外部傳進來的多項指令列
在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)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章