命令行选项:
面对有参数的命令,可能要写一下的脚本来处理
if [ $1 = -o ]; then
处理-o的代码
1=$2
2=$3
fi
这样处理代码将会变得很混乱。注意:判断是否相等的时候等号两边是有空格的,和赋值时没有空格是有区别的。
shift
对于每个参数,无论多少,只要向shift给出数值参数,它可以重复移位参数。例如:
shift 3的效果如下:
1=$4
2=$5
....
一开始的代码可以修改成:
if [ $1 = -o ]; then
处理-o选项
shift
fi
以上知识也可以扩展为处理多选项的通用技术。假设脚本为alice,要处理的选项有-a,-b,-c
while [ -n "$(echo $1 | grep '^-')" ]; do
case $1 in
-a ) process -a ;;
-b ) process -b ;;
-c ) process -c ;;
* ) echo 'usage......'
exit 1
esac
shift
done
只要$1以断划线开始,就重复检查$1,不是正确的选项的时候,返回错误状态并且退出。
带参数的选项:
如果某些选项带有自身的参数,可以使用以下的代码:
while [ -n "$(echo $1 | grep '-')" ]; do
case $1 in
-a ) echo 'a' ;;
-b ) echo 'b'
echo "b:$2"
shift ;;
-c ) echo 'c' ;;
* ) echo "error"
exit 1
esac
shift
done
echo $1
shift也相当于往后移动读取参数的指针,多琢磨琢磨!!!
getopts
上面的方法不允许使用-abc表示-a, -b, -c,也不允许指定在选项和参数之间没有空格。内置命令getopts可用作选项处理循环中的while条件。
getopts带有两个参数,第一个是包含字母和冒号的字符串,每个字母均为有效选项,如果字母后面带有冒号,则选项需要一个参数。getopts从命令行中抽出选项(不包括短划线),并赋给一个变量,变量名是getopts的第二个参数。只要还有参数需要处理,getopts就返回状态0,一旦处理完毕,则其返回退出状态1,使得while循环退出。
while getopts ":ab:c" opt; do
case $opt in
a ) echo 'a' ;;
b ) echo 'b'
echo "$OPTARG"
echo $OPTIND ;;
c ) echo 'c' ;;
\? ) echo 'error'
exit 1
esac
done
shift $(($OPTIND - 1))
echo $1
1、选项中的第一个冒号使得用户给出一个无效选项时,getopts不打印错误消息。
2、第二个参数为一个变量名,保存每次处理的选项字母(不包括短划线)。
3、如果选项带一个参数,该参数被保存在变量OPTARG
4、变量OPTIND包含要处理的下一个命令行参数的编号。也就是getopts完成之后,它等于第一个“真正”参数的号码。所以只要shift $(($OPTIND - 1))参数就又正确对上了。
问题:为什么是两对小括号而不是一对呢?
因为 $(($OPTIND - 1))是数字表达式,后面将会介绍。。。。。
敬请期待。。。。。。
阅读(1078) | 评论(0) | 转发(0) |