读取命令行参数

获取参数:

        在脚本中使用 $1,$2,$3,直到,$9 来读取命令行参数,从第十位参数开始必须在数字上加花括号 ${10},${11} 等等,$0 为脚本名称。参数之间用空格分格,参数可以是数字、英文,如果有空格需要双引号或单引号包括起来。

例:

echo $1 $2 $3 $4 $5

./demo.sh  1 2 3 4 "hello  world"    输入参数的格式


读取脚本名:

name=$( basename $0 )

        获取到脚本名称,用 $0 读取脚本名时要注意,这里的名称会包含路径名称,所以使用basename命令来获取脚本名称。

注意:如果是通过软连接执行这个脚本,$0 获取到的是这个软连接的名称


特殊参数变量:

$#        表示参数的总个数

${!#}     表示最后一个参数,${$#} 这样的方式不正确,要把括号中的美元符号换成感叹号

注意:当参数总个数为0时,$# 也为 0 ,${!#} 则返回脚本名,相当于$0


抓取所有数据:

$*        会将所有命令行参数当成一个整体,for命令遍历时也只当成一个参数

$@      将命令行的每一个参数试做单独的,for命令遍历时可以遍历出每个参数


shift命令移动参数:

shift n

        会删除命令行的前n个参数,后面的参数会补上来$2作为$1,$3作为$2,不加参数n只移动一个,$0 不会变,只从 $1 开始移动。

例:

while [ -n "$1" ]
do
        echo "$1"
        shift
done

这样就可以将所有参数输出


选项和参数的基本处理:

while [ -n "$1" ]
do
        case "$1" in
        -b )  echo "option -b";;
        -c )  param=$2 ; shift ;echo "option -c  parameter  $param";;
        * )    echo "$1 is not option";;
        esac
        shift
done

./demo.sh  -c  test  -b  -a    选项-c后面的参数会被$2接收到,并用shift删掉,顺序没有影响


使用getopt命令处理选项和参数


        getopt命令是将输入的选项和参数格式化成“-a value -b value -- value1 value2”的形式,也就是一个选项一个参数的形式,符号 -- 后面的是多余的参数。

如在脚本中写入如下内容,脚本的名称为 demo.sh 

getopt a:b:c "$@"

运行这个脚本:

./demo.sh -a aaa ddd -b bbb ccc

处理结果为:-a aaa -b bbb -- ddd ccc

一个选择一个参数,选项后面多余的参数会被放到 -- 后面。


也可以直接在后面输入选项:

getopt a:bcd: -a "one" -b -c -d "two"

        其中abcd为需要的选项,a和d后面的冒号表示a和d后面需要参数。如果给了多余的选项或者参数会有错误提示信息,用-q可以消除错误提示。

    -q    取消错误提示

set  --  $( getopt  -q  a:bcd:  "$@" )

    set命令的双破折线“--”选项可以将命令行参数替换成set命令的命令值。

例:

set  --  $( getopt  -q  a:b  "$@" )
while  [ -n "$1" ]
do
        case  "$1"  in 
        -a )   echo  "The option is  $1  parameter  is  $2"  ;  shift  ;; 
        -b )   echo "The option  is  $1" ;;
        -- )   shift  ; break ;;            #这里的shift是为了循环下面的程序可以继续从$1开始读参数,如果没有就不用了。
        *  )   echo "$1  is  not  option" ;;
        shift
done
for  param  in  "$@"
do
        echo  "The  parameter  is  $1";
done

注意:getopt命令不能处理带空格的参数,如"hello  world"是不行的。


getopts处理参数


getopts  optstring  variable

        与getopt不同的是getopts会逐个处理参数,取消报错只要在optstring之前加上一个冒号即可,字母后加冒号表示该选项有参数,OPTARG环境变量会保存每次要处理的参数,OPTIND 环境变量会保存正在处理参数的位置。

OPTARG        当前要处理的参数 option argument

OPTIND         当前参数的位置 option index

例:第一个冒号表示忽略错误

while  getopts  :ab:c  opt
do
        case "$opt" in
        a)
                echo "The option is -a Ind is $OPTIND";;
        b)
                echo "The option is -b parameter is $OPTARG Ind is $OPTIND";;
        c)
                echo "The option is -c Ind is $OPTIND";;
        *)
                echo "Unknown option $opt";;
        esac
done
shift  $[  $OPTIND - 1  ]        #$OPTIND - 1 正好是在getopts中已近定义了的参数长度,把已近定义了的移除掉剩下来的就是多余出来的参数,留给下面程序处理。
for  param  in "$@"
do
        echo  "$param"
done

./demo.sh  -ab  test0  -c  test1  test2  test3

注意:getopts可以处理带空格的参数如"hello world",未定义的选项会输出成问号“?”。


常见的linux命令选项:

-a        显示所有对象 --all

-c        生成一个计数 --count

-d        指定一个目录 --directory

-e        扩展一个对象 --extend

-f         指定读入数据的文件 --file

-h        显示帮助信息 --help

-i         忽略文本大小写 --ignore

-l         产生输出的长格式 --long

-n        使用非交互模式,批处理 --non

-o        指定输出文件 --output

-q        以安静模式运行 --quiet

-r         递归处理 --recursion

-s        以安静模式运行 --silence

-v        生成详细输出 --view

-x        排除某个对象 --exclude

-y        对所以问题回答yes --yes