Linux shell 命令行参数解析处理
前言 在bash中,可以用以下三种方式来处理命令行参数
直接处理:使用$1,$2,…,$n进行解析
getopts:单个字符选项的情况(如:-n 10 -f file.txt等选项)
getopt:可以处理单个字符选项,也可以处理长选项long-option(如:–prefix=/home等)
直接处理的方式网上很多,也很简单,直接跳过
getopts getopts 是 bash 的内部命令
getopts 的使用形式:getopts OPTION_STRING VAR;
OPTION_STRING 是类似 -u,-p 这种单字符选项
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/bash while getopts "a:b:c:" opt; do case $opt in a) use=$OPTARG echo "user is $use" ;; b) passwd=$OPTARG echo "passwd is $passwd" ;; c) #cccc=$OPTARG echo "this is -c option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]" ;; #echo "cccc is $cccc" ;; \?) echo "invalid arg" ;; esac done
运行结果:
1 2 3 # sh test.sh -u tom -p 123456 user is tom passwd is 123456
getopt getopt 是一个外部命令,不是 bash 内置命令,Linux 发行版通常会自带
老版本的getopt问题较多,增强版getopt比较好用,执行命令getopt -T; echo $?,如果输出4,则代表是增强版的
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/bin/bash filepath=$(cd `dirname $0`; pwd) show_usage="args: [-s , -e , -n , -c]\ [--sdate=, --edate=, --numprocs=, --cfile=]" if [[ -z $@ ]];then echo $show_usage exit 0 fi GETOPT_ARGS=`getopt -o s:e:n:c: -al sdate:,edate:,numprocs:,cfile: -- "$@"` #echo "$GETOPT_ARGS" eval set -- "$GETOPT_ARGS" while [ -n "$1" ] do case "$1" in -s|--sdate) sdate=$2; echo $sdate; shift 2;; -e|--edate) edate=$2; echo $edate; shift 2;; -n|--numprocs) numprocs=$2; echo $numprocs; shift 2;; -c|--cfile) cfile=$2; echo $cfile; shift 2;; --) break ;; *) echo $1,$2,$show_usage; break ;; esac done
运行结果:
1 2 3 # bash test2.sh --edate 11.11 -numprocs 123456 11.11 123456
参考链接