0%

Linux shell 命令行参数

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

参考链接