Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325411
  • 博文数量: 82
  • 博客积分: 1530
  • 博客等级: 上尉
  • 技术积分: 771
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-16 03:44
文章分类

全部博文(82)

文章存档

2011年(6)

2010年(76)

我的朋友

分类: LINUX

2010-05-04 02:32:07

命令行选项:

面对有参数的命令,可能要写一下的脚本来处理
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))是数字表达式,后面将会介绍。。。。。
敬请期待。。。。。。
阅读(1082) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~