[问题]请教getopts问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
liujingjing5
帖子: 512
注册时间: 2006-10-12 1:21
送出感谢: 0
接收感谢: 0

[问题]请教getopts问题

#1

帖子 liujingjing5 » 2007-12-28 15:14

小弟初学shell
如何实现类似 801x -u root -p 123456
getopts 的 $OPTARG只能获得一个参数值啊,第二个如何获得?
头像
bones7456
论坛版主
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#2

帖子 bones7456 » 2007-12-28 15:28

shift命令执行以后, $@将会保存命令行中剩余的参数, 但是没有之前的$1, 因为被丢弃了.

1 #!/bin/bash
2 # 使用 ./scriptname 1 2 3 4 5 来调用这个脚本
3
4 echo "$@" # 1 2 3 4 5
5 shift
6 echo "$@" # 2 3 4 5
7 shift
8 echo "$@" # 3 4 5
9
10 # 每次"shift"都会丢弃$1.
11 # "$@" 将包含剩下的参数.
关注我的blog: ε==3
头像
liujingjing5
帖子: 512
注册时间: 2006-10-12 1:21
送出感谢: 0
接收感谢: 0

#3

帖子 liujingjing5 » 2007-12-28 16:41

还有很多具体搞不来,比如这样一个程序,readbook
要求可以
readbook 路径
readbook -u 读者 路径
readbook -w 欢迎词 路径
readbook -u 读者 -w 欢迎词 路径
readbook -w 欢迎词 -u 读者 路径
#!/bin/bash
#readbook
while getopts uw: option
do
case $option in
u)
把-u 后的值传给 name
;;
w)
#欢迎词
把-w后的值传给word
;;
esac
done
echo "$name"
echo "$word"
cat $(路径)
跪求,拜托啊~~
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京
送出感谢: 0
接收感谢: 2 次

#4

帖子 aBiNg » 2007-12-29 22:09

$#获得参数个数,options的位置一般都在奇数位,可以通过$#配合shift去获得前面的options。
头像
liujingjing5
帖子: 512
注册时间: 2006-10-12 1:21
送出感谢: 0
接收感谢: 0

#5

帖子 liujingjing5 » 2007-12-30 12:00

aBiNg 写了:$#获得参数个数,options的位置一般都在奇数位,可以通过$#配合shift去获得前面的options。
但是要是用户写成这样怎么办啊?
readbook -u -w 欢迎词 路径
如何通过位置判断哪个是操作符,哪个是操作值?
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京
送出感谢: 0
接收感谢: 2 次

#6

帖子 aBiNg » 2007-12-30 17:22

在用户正确输入readbook格式情况下,getopts很有用。例如u,w两个选项:

代码: 全选

#!/bin/bash

lastnumber=$#

while getopts u:w: option
do
  case $option in
    u) name=$OPTARG;;
    w) word=$OPTARG;;
    \?) echo "Error! ... " && exit 1;;
  esac
done

readbook -u $name -w $word $lastnumber
但是getopts除了在你给它的参数之中匹配不到会报错以外,不会帮你去找别的错误。例如输入:

代码: 全选

readbook -u -w 欢迎词 路径
getopts会将"-w"字符赋给$name变量,中介就是$OPTARG,此变量是getopts命令自建的。

所以,排错的任务还得自己完成,至少getopts可能无法胜任了吧,除非你再去判断$OPTARG值中有无连字符,而这样好像又有点得不偿失了。
回复

回到 “Shell脚本”