1 shell脚本的参数

2 参数扩展


1.shell脚本的参数


从命令行传递给脚本的参数称为位置参数


shell脚本中表示位置参数的系统变量
变量名说明示例
$n

1≤n≤9,表示变量的位置顺序

n≥10

echo "$1"

echo "${11}"

$#
命令行参数的个数echo "$#"

$0

执行的脚本名称

脚本的文件名

echo "$0"

echo "$0" | cut -d/ -f2

$*
返回所有参数的值

echo "$*"

以"$1 $2 … $n"的形式输出

$@“同上”,输出形式略有不同

echo "$@"

以"$1" "$2" … "$n" 的形式输出

$_代表之前执行的命令的最后一个参数


  示例,比较$@、$*,脚本haha.sh代码如下:

#!/bin/bash

tmp=""
declare -i k=0
for i in "$@"; do
    let k+=1
    echo "Cycles: $k"
    tmp=${tmp}"$(echo $i)"
done

echo "$tmp"

如第三行,执行后输出:

$ ./haha.sh hello sunny !
Cycles: 1
Cycles: 2
Cycles: 3
hellosunny!

修改成$*,执行后如下:

$ ./haha.sh hello sunny
Cycles: 1
hello sunny !

倘若去掉第三行的双引号,输出结果都是一样的,如下:

$ ./haha.sh hello sunny !
Cycles: 1
Cycles: 2
Cycles: 3
hellosunny!

  这个例子,说明:第5行如果不带双引号的情况下,$*、$@效果一样。带了双引号,会影响程序的执行。带上双引号后,“$*”就是一个字符串;而“$@”才能准确地表示脚本的多个变量。

  上边的情况是,选项不带空格符“hello world.”,第5行“"$@"”,结果是:

Cycles: 1
hello world.

去掉第5行的双引号:

Cycles: 1
Cycles: 2
helloworld.

说明带上双引号,才能正确表示选项。

  总结如下表,+表示带上双引号、-表示不带、√表示正确处理、╳处理表示错误。

位参命令$@$*说明
+
+

位参中包含空格
+
-

-
-

-
+
程序中需要使用双引号时,选择$@



2.参数扩展


  给脚本传递多个不同值的“同位”参数。这里需要引入“getopts”命令来完成参数扩展。

  getopts的使用,有个前提:认为选项不会出现在“?”、“:”之中。


2.1.语法

  getopts的语法:getopts 选项定义 选项变量名 [args]

  “选项定义”用来设定接受的选项列表。当列表中某个字符后带着“:”时,代表其需要一个参数。

  “选项变量名”用来接收脚本的选项。

  [args]表示,一次脚本执行,需要多个选项时的用法。

  “选项参数”保存在变量OPTARG中,获取到最后一个参数的时候,getopts的返回值为假”。

  如果“选项定义”首个字符是“:”就关闭了报错机制(静默模式)。也可以使用变量“OPTERR”(设置为0)关闭报错,优先级更高。


2.2.异常

  当“选项变量名”获取到一个未定义的选项时,变量名被赋值“?”。静默模式时,选项被赋值给变量OPTARG。

  当缺少参数时,非静默模式情况下“选项变量名”被赋值“?”;选项参数处于“unset”状态。当缺少参数时,静默模式时,“选项变量名”被赋值“:”;选项参数被赋值“选项字符”。


  当从脚本获取到选项时,getopts返回为真。

#!/bin/bash
 
# 静默模式,两个选项,一个带参数,一个不带参数
while getopts ":ln:" opt
do
    case "$opt" in
        # 不带参数的预定义选项处理意见
        "l")
            echo "option $opt"
            ;;
        # 带参数的预定义选项处理意见
        "n")
            # 输出“选项”、“选项的参数”
            echo "option $opt has vlaue $OPTARG"
            ;;
        # 静默模式,不带选项的处理意见
        ":")
            echo "No arg."
            ;;
        "?")
            # 兼容下非静默模式的选项变量名的值
            echo "invalid arg."
            ;;
        "*")
            # 处理异常选项
            echo "unkown error from arg."
            ;;
    esac
done



getopts ":ln:" opt
项目意义
getopts命令
":ln:"

选项定义,定义脚本处理的选项列表

opt
选项变量名,捕获脚本执行时使用的选项
":ln:"
项目意义
:选项定义首个字符是冒号时,代表getopts运行在静默模式。
l定义了一个无参数的选项 l
n:定义带参数的选项 n


检查执行效果
执行效果


$ ./my-getopts.sh -l

option l

选项 l处理选项 l
$ ./my-getopts.sh -n

No arg.

省略参数的选项 n在循环中使用“:”处理忘记了参数的选项
$ ./my-getopts.sh -n 3

option n has vlaue 3

带参数 3 的选项 n处理 选项 n 及 n 的值 3

$ ./my-getopts.sh -k

invalid arg.

未定义的选项


2.3.试数

  探测下运行机制……

#!/bin/bash

declare -i sw=0

while getopts ":abc" option
do
        echo "option is ${option}."
        echo "OPTARG is ${OPTARG}."
        echo "OPTIND is ${OPTIND}."
        sw=1
done

# Without option
[ $sw -eq 0 ] && echo "without any option?" && echo "OPTIND is ${OPTIND}."