脚本乐园 Shell中命令行选项和参数的处理
2023-09-27 14:29:31 时间
在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
if [ $# -lt 1 ]; then
echo "error.. need args"
exit 1
fi
echo "commond is $0"
echo "args are:"
for arg in "$@"
do
echo $arg
done
运行命令:./getargs.sh 11 22 cc
commond is ./getargs.sh
args are:
11
22
cc
2.getopts (Shell内置命令)
处理命令行参数是一个相似而又复杂的事情,为此,C提供了getopt/getopt_long等函数,C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt.
先说一下getopts/getopt的区别吧,getopt是个外部binary文件,而getopts是shell builtin。 [admin@intlqa142055x ~]$ type getopt
getopt is /usr/bin/getopt
[admin@intlqa142055x ~]$ type getopts
getopts is a shell builtin
getopts不能直接处理长的选项(如:--prefix=/home等)
关于getopts的使用方法,可以man bash 搜索getopts
getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“OPTARG”中。提供getopts的shell内置了OPTARG这个变变,getopts修改了这个变量。
这里变量$OPTARG存储相应选项的参数,而$OPTIND总是存储原始$*中下一个要处理的元素位置。
while getopts ":a:bc" opt #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
代码实例(getopts.sh): echo $*
while getopts ":a:bc" opt
do
case $opt in
a ) echo $OPTARG
echo $OPTIND;;
b ) echo "b $OPTIND";;
c ) echo "c $OPTIND";;
? ) echo "error"
exit 1;;
esac
done
echo $OPTIND
shift $(($OPTIND - 1))
#通过shift $(($OPTIND - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。
echo $0
echo $*
执行命令:./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh
3.getopt(一个外部工具)
具体用用法可以 man getopt
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
#--long表示长选项
简单举个例子吧(getopt.sh):
#!/bin/bash
# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script. language can be found
# as parse.tcsh
# Example input and output (from the bash prompt):
# ./parse.bash -a par1 another arg --c-long wow!*\? -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more
# Option b, argument ` very long
# Remaining arguments:
# -- `par1
# -- `another arg
# -- `wow!*\?
# Note that we use `"$@" to let each command-line parameter expand to a
# separate word. The quotes around `$@ are essential!
# We need TEMP as the `eval set -- would nuke the return value of getopt.
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项。
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n example.bash -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." exit 1 ; fi
# Note the quotes around `$TEMP: they are essential!
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"
#经过getopt的处理,下面处理具体选项。
while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
"") echo "Option c, no argument"; shift 2 ;;
*) echo "Option c, argument \`$2" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo -- "\`$arg" ;
done
运行命令:./getopt.sh --b-long abc -a -c33 remain
Option b, argument `abc
Option a
Option c, argument `33
Remaining arguments:
-- `remain
参考资料:
http://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html
http://www.orczhou.com/index.php/2010/04/linux-shell-getopt/
http://blog.csdn.net/flowingflying/archive/2010/01/03/5126066.aspx
shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份 在基于 `k8s` 平台的容器化部署环境中,有时候需要快速的实现部署文件的迁移备份,当 `k8s` 平台部署一个 `app` 时,都会相应的产生一堆 `yaml` 文件,如果 `yaml` 文件数量较少,我们可以人工手动的方式进行拷贝,但是当 `yaml` 文件数量多,并且该 `k8s` 平台部署了多个 `app` 时,如果在采用...
《Shell 脚本速查手册》电子版地址 编写Bash脚本耗时长?不稳定?有妙招!阿里云开发者社区和linux中国开源社区联手推出《Shell脚本速查手册》,为运维工程师提供一个快速、便捷的查询手册,以共开发者查询自己日常工作中常用的命令和脚本。
使用Shell脚本进行语句循环 除了上一篇文章介绍的if条件语句之外,(本文不再介绍if条件语句,感兴趣的小伙伴可以参考上一章介绍的 使用Shell脚本进行条件测试)作为一种脚本编程语言,Shell同样包含循环,分支等其他程序控制结构,从而能够轻松完成更加复杂,强大的功能。本文将介绍for、while、case语句的具体应用。
使用Shell脚本进行条件测试 ⭐本文介绍⭐ 在简单的Shell程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程,然而,单一的顺序结构使得脚本过于机械化,不够 智能 ,难以处理更加灵活得系统任务。本文将学习如何进行条件测试,并通过正确使用if语句,使Shell脚本具有一定得 判断 能力,以根据不同得的条件来完成不同的管理任务。
使用Shell脚本安装MySQL(二) ⭐本文介绍⭐ 随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。本文将主要介绍Shell脚本的基础,变量使用等知识。
Shell 脚本的编写总结 这篇文章主要是为了记录一下Shell脚本的使用语法,前几天写了一个shell脚本,其中,也遇到了一些语法不清楚的情况,在此记录一下已备后续使用
在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:
在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
1.直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;
2.getopts来处理,单个字符选项的情况(如:-n 10 -f file.txt等选项);
3.getopt,可以处理单个字符选项,也可以处理长选项long-option(如:--prefix=/home等)。
总结:一般小脚本手工处理也许就够了,getopts能处理绝大多数的情况,getopt较复杂、功能也更强大。
下面分别进行简单的说明:
1.直接手工处理位置参数
必须要要知道几个变量,
* $0 :即命令本身,相当于C/C++中的argv[0]
* $1 :第一个参数.
* $2, $3, $4 ... :第2、3、4个参数,依次类推。
* $# 参数的个数,不包括命令本身
* $@ :参数本身的列表,也不包括命令本身
* $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组。
手工处理方式能满足多数的简单需求,配合shift使用也能构造出强大的功能,但处理复杂选项的时候建议用下面的两种方法。
给个实例吧(getargs.sh):
if [ $# -lt 1 ]; then
echo "error.. need args"
exit 1
fi
echo "commond is $0"
echo "args are:"
for arg in "$@"
do
echo $arg
done
运行命令:./getargs.sh 11 22 cc
commond is ./getargs.sh
args are:
11
22
cc
2.getopts (Shell内置命令)
处理命令行参数是一个相似而又复杂的事情,为此,C提供了getopt/getopt_long等函数,C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt.
先说一下getopts/getopt的区别吧,getopt是个外部binary文件,而getopts是shell builtin。 [admin@intlqa142055x ~]$ type getopt
getopt is /usr/bin/getopt
[admin@intlqa142055x ~]$ type getopts
getopts is a shell builtin
getopts不能直接处理长的选项(如:--prefix=/home等)
关于getopts的使用方法,可以man bash 搜索getopts
getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“OPTARG”中。提供getopts的shell内置了OPTARG这个变变,getopts修改了这个变量。
这里变量$OPTARG存储相应选项的参数,而$OPTIND总是存储原始$*中下一个要处理的元素位置。
while getopts ":a:bc" opt #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
代码实例(getopts.sh): echo $*
while getopts ":a:bc" opt
do
case $opt in
a ) echo $OPTARG
echo $OPTIND;;
b ) echo "b $OPTIND";;
c ) echo "c $OPTIND";;
? ) echo "error"
exit 1;;
esac
done
echo $OPTIND
shift $(($OPTIND - 1))
#通过shift $(($OPTIND - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。
echo $0
echo $*
执行命令:./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh
3.getopt(一个外部工具)
具体用用法可以 man getopt
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
#--long表示长选项
简单举个例子吧(getopt.sh):
#!/bin/bash
# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script. language can be found
# as parse.tcsh
# Example input and output (from the bash prompt):
# ./parse.bash -a par1 another arg --c-long wow!*\? -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more
# Option b, argument ` very long
# Remaining arguments:
# -- `par1
# -- `another arg
# -- `wow!*\?
# Note that we use `"$@" to let each command-line parameter expand to a
# separate word. The quotes around `$@ are essential!
# We need TEMP as the `eval set -- would nuke the return value of getopt.
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项。
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n example.bash -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." exit 1 ; fi
# Note the quotes around `$TEMP: they are essential!
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"
#经过getopt的处理,下面处理具体选项。
while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
"") echo "Option c, no argument"; shift 2 ;;
*) echo "Option c, argument \`$2" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo -- "\`$arg" ;
done
运行命令:./getopt.sh --b-long abc -a -c33 remain
Option b, argument `abc
Option a
Option c, argument `33
Remaining arguments:
-- `remain
参考资料:
http://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html
http://www.orczhou.com/index.php/2010/04/linux-shell-getopt/
http://blog.csdn.net/flowingflying/archive/2010/01/03/5126066.aspx
shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份 在基于 `k8s` 平台的容器化部署环境中,有时候需要快速的实现部署文件的迁移备份,当 `k8s` 平台部署一个 `app` 时,都会相应的产生一堆 `yaml` 文件,如果 `yaml` 文件数量较少,我们可以人工手动的方式进行拷贝,但是当 `yaml` 文件数量多,并且该 `k8s` 平台部署了多个 `app` 时,如果在采用...
《Shell 脚本速查手册》电子版地址 编写Bash脚本耗时长?不稳定?有妙招!阿里云开发者社区和linux中国开源社区联手推出《Shell脚本速查手册》,为运维工程师提供一个快速、便捷的查询手册,以共开发者查询自己日常工作中常用的命令和脚本。
使用Shell脚本进行语句循环 除了上一篇文章介绍的if条件语句之外,(本文不再介绍if条件语句,感兴趣的小伙伴可以参考上一章介绍的 使用Shell脚本进行条件测试)作为一种脚本编程语言,Shell同样包含循环,分支等其他程序控制结构,从而能够轻松完成更加复杂,强大的功能。本文将介绍for、while、case语句的具体应用。
使用Shell脚本进行条件测试 ⭐本文介绍⭐ 在简单的Shell程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程,然而,单一的顺序结构使得脚本过于机械化,不够 智能 ,难以处理更加灵活得系统任务。本文将学习如何进行条件测试,并通过正确使用if语句,使Shell脚本具有一定得 判断 能力,以根据不同得的条件来完成不同的管理任务。
使用Shell脚本安装MySQL(二) ⭐本文介绍⭐ 随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。本文将主要介绍Shell脚本的基础,变量使用等知识。
Shell 脚本的编写总结 这篇文章主要是为了记录一下Shell脚本的使用语法,前几天写了一个shell脚本,其中,也遇到了一些语法不清楚的情况,在此记录一下已备后续使用
相关文章
- Windows利用命令行快速清除以及建立密码
- Bash Getopts - 让你的脚本支持命令行参数
- 4个可以发送完整电子邮件的命令行工具
- nodejs 命令行获取入参
- Caffe学习系列(10):命令行解析
- Zookeeper(一)CentOS7.5搭建Zookeeper3.4.12集群与命令行操作
- 命令行通配符及转义字符
- 数据库命令行工具osql.exe工具的妙用和相关参数
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---34
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---32
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---26
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---21
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---07
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---04
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---50
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---22
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---53
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---17
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---12
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---1
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---0