shell 获取参数


原文链接: shell 获取参数
#!/bin/sh
host="localhost"
port=3306
# 1. 选项后面的冒号表示该选项需要参数
# 2. 获取参数使用 $OPTARG
while getopts ':hp' args
do
    case $args in
        h)  host=$OPTARG ;;
        p)  port=$OPTARG ;;
        ?)  echo $args 'not matched' 
            exit 1  ;;
        :)  echo "Option -$OPTARG requires an argument." >&2
            exit 1 ;;
        *)  printf "Usage: %s\n" $0
          exit ;;
    esac
done
#   对于选项有值的话,会把选项对应的值赋值给OPTARG这个内置变量
#	OPTIND是一个内置计数器,增加一个选项都会对计数器+1或+2
#	但是getopts不支持长选项,getopt支持 
while getopts "f(file):s(server):" flag
    do
        echo "$flag" $OPTIND $OPTARG
done
# 在 while 循环中使用 getopts 解析命令行选项
# 要解析的选项有 -h、-v、-f 和 -o,其中 -f 和 -o 选项带有参数
# 字符串选项中第一个冒号表示 getopts 使用抑制错误报告模式

# optstring定义了四个有效选项字母: h, v, f, o
# 冒号(:)被放在了字母f和o后面,因为f选项、o选项各需要一个参数值

while getopts :hvf:o: opt
do
        case "$opt" in
                # 输入一个文件,并检测文件是否存在
                # gswewf@gswewf-PC:~/yhb/es_search$ ./getopts_2.sh -f asdfwef.pdf
                f)
                        filename=$OPTARG
                        if [ ! -f $filename ]
                        then
                                echo "源文件 $filename 不存在!"
                                exit
                        fi
                        ;;
                h)
                        usage
                        exit
                        ;;
                :)
                        echo "选项 -$OPTARG 需要有个参数."
                        usage
                        exit 1
                        ;;
                ?)
                        echo "无效的选项: -$OPTARG"
                        usage
                        exit 2
                        ;;
        esac
done

echo "变量 valag 的值是: ${vflag}"

#getopts 是 shell 内建命令, getopt 是一个独立外部工具
#getopts 使用语法简单,getopt 使用语法复杂
#getopts 不支持长参数(长选项,如 --option), getopt 支持
#getopts 不会重排所有参数的顺序,getopt会重排参数顺序 (getopts 的 shell 内置 OPTARG 这个变量,getopts 通过修改这个变量依次获取参数,而 getopt 必须使用 set 来重新设定位置参数,然后在 getopt 中使用 shift 来依次获取参数)
#如果某个参数中含有空格,那么这个参数就变成了多个参数。因此,基本上,如果参数中可能含有空格,那么必须用getopts(新版本的 getopt 也可以使用空格的参数,只是传参时,需要用 双引号 包起来)。
`