💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# **一、SHELL位置变量** ## **1.位置变量说明** ``` $0 获取当前执行的脚本文件名 $n 获取当前执行的脚本的第n个参数,n大于10要用大括号,用于传参 $# 获取当前脚本所有后面所接参数的总个数 $* 获取当前脚本所有传参的参数 $@ 获取当前脚本所有传参的参数 ``` > $*和$@不加双引号时无区别,加双引号时,$"*"将所有参数视为单个字符串,$"@"将所有字符串视为不同的独立字符串 ## **2.$0、$#、$n联合演示** * cat test.sh ``` if [ $# -ne 2 ] #如果传入参数不是2个 then echo "/bin/sh $0 arg1 arg2" #提示用户脚本路径和用法 exit 1 #退出并返回1 fi echo $1 $2 #满足2个参数则执行命令 ``` * sh test.sh `/bin/sh test.sh arg1 arg2. `不加参数,提示用户用法 * sh test.sh ni wo `ni wo` 正确执行结果 # **二、shell状态变量** ## **1.特殊状态变量** |变量|用途| |---|---| |$?|获取上一个指令的执行状态返回值(0表示成功,非0表示失败,很常用)| |$$|获取当前执行的脚本的进程号(PID)| |$!|获取上一个在后台工作的进程的进程号(PID)| |$_|获取在此之前执行的命令或脚本的最后一个参数 | ## **2.$?用途详解** 1. 不同命令的执行结果中,$?的返回值不尽相同,但常用的就是0和非0两种状态,0表示成功,非0表示失败,可以通过获取返回值,来确定程序是否执行成功。 2. 在对数据进行备份时,在执行完关键命令后,获取返回值,来确定命令是否成功,备份数据是否完成 * **在企业场景中,$?的用法如下** * 判断命令、脚本或函数等程序是否执行成功 * 坐在脚本中执行“exit 数字”,则会返回这个数字给$?变量 * 如果是再函数中,则通过“return 数字”吧这个数字传给$?S ## **3.$?脚本案例讲解** * sed -n '63,73p' /etc/init.d/rpcbind ``` stop() { echo -n $"Stopping $prog: " killproc $prog RETVAL=$? #将$?的值赋值给变量RETVAL echo [ $RETVAL -eq 0 ] && { #判断当返回值为0是,执行下面操作 rm -f /var/lock/subsys/$prog rm -f /var/run/rpcbind* } return $RETVAL ``` > 如果返回值不为0,不执行命令,将返回值传递给stop脚本 # **三、shell特殊变量** ## **1.语法和功能** | 变量名| 变量作用说明 | | --- | --- | | ${var:-word} | 如果变量未赋值或为空,则用word值替代 | | ${var:=word} | 如果变量未赋值或为空,则用word值赋值并替代 | | ${var:+word} | 如果变量已赋值或为不为空,则用word值替代 | | ${var:?word}} | 如果变量未赋值或为空,则用word值作为错误输出 | > 冒号非必须,省略冒号,则只针对未赋值的变量,加上冒号,就包括为空的变量 ## **2.演示案例** * cat /server/scripts/t2.sh ``` echo 'echo ${var:-ttt}-->' ${var:-ttt} echo 'echo $var-->' $var echo 'echo ${var:=ttt}-->' ${var:=ttt} echo 'echo $var-->' $var echo 'echo ${var:+MMM}-->' ${var:+MMM} echo 'echo $var-->' $var echo 'unset var and echo ${var:?the error}-->' unset var echo ${var:?the error} ``` * sh /server/scripts/t2.sh ``` echo ${var:-ttt}--> ttt echo $var--> #变量未赋值,则用ttt代替输出,查看变量仍然未赋值 echo ${var:=ttt}--> ttt echo $var--> ttt #变量未赋值,则用ttt代替输出,查看变量已被赋值 echo ${var:+MMM}--> MMM echo $var--> ttt #变量已赋值,则用MMM代替输出,查看变量仍然为ttt unset var and echo ${var:?the error}--> /server/scripts/t2.sh: line 9: var: the error #变量未赋值则输出定义的报警信息 ``` ## **3.企业工作用途** 在企业中,针对目录路径等的处理就可以上述变量不存在则赋值的方式,防止因目录路径不存在而导致的异常,特别是针对变量的删除操作,这种方式很有用,否则删除的变量不存在时,可能 导致未知的危险 `find ${path:-/tmp} -name "*.tar.gz" -type f -mtime +7|xargs rm -f ` > 如上命令,当路径变量不存在时,用/tmp路径代替