shell传入参数处理方式

1.参数处理-Shell传入参数的处理
    1. $# 传递到脚本的参数个数
    2. $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
    3.脚本运行的当前进程ID号
    4. $! 后台运行的最后一个进程的进程ID号
    5. $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
    6. $- 显示shell使用的当前选项,与set命令功能相同
    7. $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

2.变量 含义  
    $0 脚本名字  
    $1 位置参数 #1  
    $2 - $9 位置参数 #2 - #9  
    ${10} 位置参数 #10  
    $# 位置参数的个数  
    "$*" 所有的位置参数(作为单个字符串)
    "$@" 所有的位置参数(每个都作为独立的字符串)  
    ${#*} 传递到脚本中的命令行参数的个数  
    ${#@} 传递到脚本中的命令行参数的个数  
    $? 返回值

    脚本的进程ID(PID)
    $- 传递到脚本中的标志(使用set)
    $_ 之前命令的最后一个参数
    $! 运行在后台的最后一个作业的进程ID(PID)

3.在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景
(1)手工处理方式
    在手工处理方式中,首先要知道几个变量,还是以./test.sh -f config.conf -v --prefix=/home的命令行为例:
    *    $0 : ./test.sh,即命令本身,相当于C/C++中的argv[0]
    *    $1 : -f,第一个参数.
    *    $2 : config.conf
    *    $3, $4 ... :类推。
    *    $# 参数的个数,不包括命令本身,上例中$#为4.
    *    $@ :参数本身的列表,也不包括命令本身,如上例为 -f config.conf -v --prefix=/home
    *    $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组。如下例所示:


    程序:
    #!/usr/bin/env bash

    for arg in "$*"
    do
        echo $arg
    done

    输出为:
        -f config.conf -v --prefix=/home

    程序:
    for arg in "$@"
    do
        echo $arg
    done

    输出为:
        -f
        config.conf
        -v
        --prefix=/home


    手工处理的方式即对这些变量的处理。因为手工处理高度依赖于你在命令行上所传参数的位置,所以一般都只用来处理较简单的参数。如
   ./test.sh 10
   而很少使用./test -n 10这种带选项的方式。 典型用法为:

    #!/usr/bin/env bash

    echo $0
    echo $1
    if [ x$1 != x ]
    then
        echo 'have params'
    else
        echo 'no params'
    fi

    为什么要使用 x$1 != x 这种方式来比较呢?想像一下这种方式比较:
    if [ -n $1 ] #$1不为空
    但如果用户不传参数的时候,$1为空,这时 就会变成 [ -n ] ,所以需要加一个辅助字符串来进行比较手工处理方式能满足大多数的
    简单需求,配合shift使用也能构造出强大的功能,但在要处理复杂选项的时候建议用下面的两种方法。

(2)getopts
    处理命令行参数是一个相似而又复杂的事情,为此,C提供了getopt/getopt_long等函数,
    C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt.
    getopts和getopt功能相似但又不完全相同,其中getopt是独立的可执行文件,而getopts是由Bash内置的。

先来看看参数传递的典型用法:
    * ./test.sh -a -b -c : 短选项,各选项不需参数
    * ./test.sh -abc   : 短选项,和上一种方法的效果一样,只是将所有的选项写在一起。
    * ./test.sh -a args -b -c :短选项,其中-a需要参数,而-b -c不需参数。
    * ./test.sh --a-long=args --b-long :长选项
我们先来看getopts,它不支持长选项。


(3)getopt


学习网址:http://blog.csdn.net/qzwujiaying/article/details/6371246

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值