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灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP