Shell脚本参数获取的两种方式

news/2024/12/21 13:14:01/

一、Shell 参数获取的两种方式

方式一

示例

新建一个test.sh文件

#!/bin/bash
echo "shell 名称 = $0"
echo "参数1 = $1"
echo "参数2 = $2"
echo "参数3 = $3"
echo "参数4 = $4"
echo "参数5 = $5"

执行脚本 : sh test.sh 5 6 3 6 2

  • 输出的结果:

  • shell 名称 = test.sh
    参数1 = 5
    参数2 = 6
    参数3 = 3
    参数4 = 6
    参数5 = 2
    
  • 使用该方式有两点需要注意的地方:“$0” 表示的是脚本名称本身

    • 优点 : 获取参数方便、简洁
    • 缺点 :必须按照指定的顺序输入参数,中间不能漏参数。否则参数将会产生错乱。

方式二 使用 getopts 方式获取

  • 如果需要实现类似 job_3.sh -f -d 指定参数值的方式,则推荐使用此种方式。
    使用该方式需要使用到Shell内置的函数"getopts"。
    在使用之前你需要知道一下几个内置参数的意义:
    1.optstring option :字符串,当中为参数选项,会逐个匹配。
    2.varname :每次匹配成功的选项
    3.arg :参数值
    4.$OPTIND :option index,会逐个递增,初始值为1
    5.$OPTARG :option argument,不同情况下会有不同的值

该函数的具体使用方式 : getopts [option[:]] VARIABLE
参数说明:

  • [option[:]] 表示参数,以"?️b:c:"的方式设置
    #####注意细节:
  1. 以":"开头时:getopts不会提示错误信息,会区分invalid option错误和miss option argument,两种错误的值不一样。invalid option错误时,VARIABLE会被设为*?。为出问题的option。miss option argument时,VARIABLE会被设为*。$OPTARG为出问题的option。
  2. 不以":"开头时:getopts会提示错误信息。会根据invalid option错误和miss option argument。提示两种不同的错误。VARIABLE都会被设为?。$OPTARG都为空。
  3. 如果option后面跟了":"表示该option可以接收参数,参数(argument)会被放在$OPTARG中。

示例getopt.sh

#!/bin/bashwhile getopts ":a:p:n:s:" opt
docase $opt inn)echo "$OPTARG";;s)echo "$OPTARG";;a)echo "$OPTARG";;p)echo "$OPTARG";;*)echo "未知参数$opt"echo "参数值$OPTARG";;?)echo "未知参数$opt"echo "参数值$OPTARG";;esac
done
  • 执行:sh getopt.sh -a 12 -p 32 -s string -n 你好 -r 世界

  • 输出:

12
32
string
你好
install.sh: 非法选项 -- r
未知参数?
参数值

可选参数示例

  • 脚本可以传1到多个参数该如何处理?如下面例子:
#!/bin/bash
readonly CURR=$(readlink -m $(dirname $0))
#
path=`sed -n '/^\[path/{:a1;n;/^$/q;p;ba1}' $CURR/../conf/extract_config | sed 's/[ \t]//g' `
file=` sed -n '/^\[file/{:a1;n;/^$/q;p;ba1}' $CURR/../conf/extract_config | sed 's/[ \t]//g' `
date='date -d yesterday + '%Y%m%d'`
#/cib/etl_job
app_path=` sed -n '/^\[app_path/{:a1;n;/^$/q;p;ba1}' $CURR/../conf/extract_config | sed 's/[ \t]//g' `
today=`date + %Y%m%d`show_usage=" args:[ -p,-f,-d,-h] [--path, --file, --date, --help]"
GETOPT_ARGS=`getopt -o p:f:d:h -al path:file:date:qhlep --"$@"eval set -- "$GETOPT_ARGS"
while [ -n "$1" ]
docase "$1" in-p|--path) test -z $2 || path=$2; shift 2;;-f|--file)    test -z $2 || file=$2; shift 2;;-d|--date) test -z $2 || date=$2; shift 2;;-h|--help)cat  $CURR/../conf/readme1 && exit 0; shift 2;;
--) break;;
*) echo $1 , $2; shift 1;;
esac
done

这段Shell代码是一个使用getopt解析命令行参数的示例。

代码解释如下:

  1. GETOPT_ARGS=$(getopt -o p:f:d:h -al path:file:date:help -- "$@")

    • 使用getopt命令解析命令行参数,并将结果保存到GETOPT_ARGS变量中。
    • -o后面跟短选项,例如p:f:d:h表示短选项为-p-f-d-h
    • -l后面跟长选项,例如path:file:date:help表示长选项为--path--file--date--help
    • --表示选项结束,之后的参数将被视为位置参数。
    • "$@"表示将脚本接收到的所有参数传递给getopt命令。
  2. eval set -- "$GETOPT_ARGS"

    • GETOPT_ARGS的值设置为新的参数列表,相当于重置了脚本中的位置参数。这样,后续的$1$2等就可以用于处理解析后的命令行参数。
  3. while [ -n "$1" ]

    • 这是一个循环语句,用于逐个处理命令行参数,直到所有参数都被处理完毕。
  4. case "$1" in ... esac

    • 这是一个条件判断语句,根据当前参数的值执行相应的操作。
  5. -p | --path) test -z $2 || path=$2; shift 2;;

    • 当参数是-p--path时,将下一个参数(即$2)赋值给path变量,并通过shift 2将已处理的两个位置参数移除。
  6. -f | --file) test -z $2 || file=$2; shift 2;;

    • 当参数是-f--file时,将下一个参数(即$2)赋值给file变量,并通过shift 2将已处理的两个位置参数移除。
  7. -d | --date) test -z $2 || date=$2; shift 2;;

    • 当参数是-d--date时,将下一个参数(即$2)赋值给date变量,并通过shift 2将已处理的两个位置参数移除。
  8. -h | --help) cat $CURR/../conf/readme1 && exit 0; shift 2;;

    • 当参数是-h--help时,打印readme1文件的内容并退出脚本。
  9. --) break;;

    • 当遇到--标记时,停止循环。
  10. *) echo $1 , $2; shift 1;;

    • 对于其他未匹配的参数,打印参数的值,并通过shift 1将已处理的一个位置参数移除。

通过以上步骤,脚本会逐个处理命令行参数,并根据参数的类型进行相应的操作。可以根据实际需求修改每个选项的处理逻辑和操作。


file=sed -n '/^\[file/{:a1;n;/^$/q;p;ba1}' $CURR/../conf/extract_config | sed 's/[ \t]//g' 这个命令什么含义?
这个命令的含义是从指定文件中提取包含[file开头的行,并将其保存到变量file中。下面是对该命令的解释:

  1. sed -n '/^\[file/{:a1;n;/^$/q;p;ba1}' $CURR/../conf/extract_config:这部分命令使用sed工具从文件$CURR/../conf/extract_config中提取特定的行。

    • sed -n:关闭默认输出,并使用静默模式。
    • /^\[file/:匹配以[file开头的行。
    • :a1:定义一个标签a1,用于后续跳转。
    • n:读取下一行。
    • /^$/q:如果读取的行是空行,则退出命令执行。
    • p:打印满足条件的行。
    • ba1:跳转到标签a1,实现循环。
  2. sed 's/[ \t]//g':这部分命令使用sed工具删除变量file中的空格和制表符。

    • s/[ \t]//g:将空格和制表符替换为空字符,并应用于整个字符串。

最终,通过这个命令,将文件$CURR/../conf/extract_config中以[file开头的行提取出来,并存储到变量file中。然后对变量file中的空格和制表符进行删除操作。

二、Shell脚本之shift用法

shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。

示例1:

依次读取输入的参数并打印参数个数:

  • run.sh

    • #!/bin/bashwhile [ $# != 0 ];doecho "第一个参数为:$1,参数个数为:$#"shiftdone
      
  • 输入如下命令运行:run.sh a b c d e f

  • 结果显示如下:

  • 第一个参数为:a,参数个数为:6第一个参数为:b,参数个数为:5第一个参数为:c,参数个数为:4第一个参数为:d,参数个数为:3第一个参数为:e,参数个数为:2第一个参数为:f,参数个数为:1
    
  • 从上可知 shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。

    同理,shift n后,前n位参数都会被销毁,比如:

    • 输入5个参数: abcd e

那么$1=a,$2=b,$3=c,$4=d,$5=e,执行shift 3操作后,前3个参数a、b、c被销毁,就剩下了2个参数:d,e(这时d=$1,e=$2,其中d由$4—>$1,e由$5—>$2),参考示例如下:

示例2:

#!/bin/bashecho "参数个数为:$#,其中:"for i in $(seq 1 $#)doeval j=\$$iecho "第$i个参数($"$i"):$j"doneshift 3echo "执行shift 3操作后:"echo "参数个数为:$#,其中:"for i in $(seq 1 $#)do

通过eval把i变量的值($i)作为变量j的名字

eval j=\$$iecho "第$i个参数($"$i"):$j"done

输出结果为:

参数个数为:5,其中:第1个参数($1):a第2个参数($2):b第3个参数($3):c第4个参数($4):d第5个参数($5):e执行shift 3操作后:参数个数为:2,其中:第1个参数($1):d第2个参数($2):e

http://www.ppmy.cn/news/739104.html

相关文章

vue有意思的图片动画插件direction-reveal

功能:操作简单好上头,动画特效很丝滑,有很多种供选择 1.下载插件 npm install direction-reveal --save-dev 2.使用 导入到需要使用动画的单页面 import DirectionReveal from direction-reveal; 使用样式 mounted() {this.query();},m…

解决HP ProLiant DL380 G5的安装与启动CentOS7时不能识别raid硬盘问题

最近去机房给一台HP DL380G5重装操作系统时,发现CentOS7无法识别到硬盘,这台服务器做的raid1,有理由怀疑新系统无法支持老机器的raid卡,查了些资料在此做个记录。 一、无法识别的原因 参看: https://www.kernel.org/…

dell服务器SLOt3硬盘,dell和hp服务器磁盘检测命令

DELL检测工具 #/opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aALL 查raid级别 #/opt/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -aALL 查raid卡信息 #/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL 查看硬盘信息 #/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -aAll 查看电…

戴尔计算机软件的安装,怎么安装dell电脑系统

先要做个系统分区.现在街上有卖那种GHOST XP的光盘,买一张回来,放到光驱里,启动的时候按着F12选择引导方式.选择从CD-ROM启动,然后进入光盘的启动界面,你可以选择MQ进行分区,可以照着系统的提示去做.分区完毕之后,再重新启动,同样选择光盘启动,进入GHOST界面,系统会自动GHOST. …

瘦客户机之战白热化 戴尔惠普纷纷祭出VDI硬件

就在前不久于旧金山召开的思杰Synergy 2012大会上,惠普宣布了一款新的零客户机(zero client),戴尔则为其桌面虚拟化解决方案(DVS)系统添加了另一款虚拟桌面基础设施(VDI)组件。现在归属戴尔的慧智科技公司(Wyse Technology Inc.)也在近日发布了一款新的零…

惠普和戴尔加入IaaS云行列中来

惠普和戴尔都进入了IaaS云服务业务,建立基础设施在自己的服务器和OpenStack(HP)/ vCloud(戴尔)。 .戴尔的承诺来用两种基于窗口,云OpenStack蔚蓝。 HPHPannounced宣布their support of the他们的支持OpenStackOpenStackplatform in July of this year, joining some 100 othe…

raid 物理盘缓存状态_MegaCli 监控raid状态 限戴尔服务器

MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等。通常,我们对硬盘当前的状态不太好确定,一般通过机房人员…

戴尔服务器换盘及raid创建操作手册

ceph集群单个数据盘的raid方式不同(单盘raid0、jbod、多盘raid0),所使用的服务器不同(惠普、戴尔等),因此在换盘时,如何能让管理系统识别这个新盘,所需要的操作也不同,通…