作者milochen (N=NP)
看板LinuxDev
标题Re: [问题] shell scripts读取外部传进来的多项指令列
时间Sun Feb 15 19:24:30 2009
在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)