3.1 shell中的特殊位置参数变量
常用的特殊位置参数变量说明
位置变量 | 作用说明 |
$0 | 获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名;如果n大于9,则用大括号括起来,例如${10},接的参数以空格隔开 |
$# | 获取当前执行的shell脚本后面接的参数的总个数 |
$* | 获取当前shell脚本所有传参的参数,不加引号和$@相同;如果给$*加上双引号,例如:”$*”,则表示将所有的参数视为单个字符串,相当于”$1 $2 $3” |
$@ | 获取当前shell脚本所有传参的参数,不加引号和$*相同;如果给$@加上双引号,例如:”$@”,则表示将所有的参数视为不同的独立字符串,相当于”$1” “$2” “$3” “…”。这是将多参数传递给其他程序的最佳方式,因为它会保留所有的内嵌在每个参数的任何空白。当$@和$*都加双引号时,两者是有区别的;都不加双引号时,两者无区别。 |
1、$1 $2 …$9 ${10} ${11}..特殊变量实践
[root@wangxian script]# cat n.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} [root@wangxian script]# sh n.sh a a [root@wangxian script]# sh n.sh a b a b [root@wangxian script]# sh n.sh a b c a b c [root@wangxian script]# sh n.sh "a b" b a b b [root@wangxian script]# echo \${1..11} >n.sh [root@wangxian script]# cat n.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11
当参数数字大于9时,需要用大括号将数字括起来
[root@wangxian script]# cat n.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}
2、$0特殊变量的作用及变量实践
$0的作用为取出执行脚本的名称(包括路径)
[root@wangxian script]# cat path.sh echo $0 [root@wangxian script]# sh path.sh path.sh [root@wangxian script]# sh /server/script/path.sh /server/script/path.sh
利用dirname及basename命令单独获取名称或路径
[root@wangxian script]# dirname /server/script/path.sh /server/script [root@wangxian script]# basename /server/script/path.sh path.sh
[root@wangxian script]# cat path.sh dirname $0 basename $0 [root@wangxian script]# sh /server/script/path.sh /server/script path.sh
$0这个位置参数的系统生产场景案例:
[root@nfs-server ~]# tail -6 /etc/init.d/rpcbind echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}" RETVAL=2 ;; esac exit $RETVAL [root@nfs-server ~]# /etc/init.d/rpcbind
Usage: /etc/init.d/rpcbind {start|stop|status|restart|reload|force-reload|condrestart|try-restart}
上文就是$0从脚本命令行获取的值
3、$#特殊变量获取脚本传参个数的实践
通过$#获取脚本传参的个数
[root@wangxian script]# cat n.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} echo $# [root@wangxian script]# sh n.sh wangxian lile xiaoming wangxian lile xiaoming 3
4、$*和$@特殊变量功能及区别说明
[root@wangxian script]# set -- "I am" handsome boy [root@wangxian script]# echo $1 I am [root@wangxian script]# echo $2 handsome [root@wangxian script]# echo $* I am handsome boy [root@wangxian script]# echo $@ I am handsome boy [root@wangxian script]# for i in $*;do echo $i;done I am handsome boy [root@wangxian script]# for i in $@;do echo $i;done I am handsome boy
测试”$*”和”$@”区别(带有双引号)
[root@wangxian script]# for i in "$@";do echo $i;done I am handsome boy [root@wangxian script]# for i in "$*";do echo $i;done I am handsome boy
3.2 shell进程中的特殊状态变量
位置变量 | 作用说明 |
$? | 获取执行上一个指令的执行状态返回值(0为成功,非0为失败),这个变量最常用 |
$$ | 获取当前执行的shell脚本的进程号PID,不常用,了解 |
$! | 获取上一个在后台工作的进程的进程号PID,不常用,了解 |
$_ | 获取在此之前执行的命令或脚本的最后一个参数,不常用,了解 |
在企业场景下,”$?”返回值的用法:
1)判断命令、脚本或函数等程序是否执行成功
2)若在脚本中调用执行“exit数字”,则会返回这个数字给“$?”变量
3)如果是在函数里,则通过“return数字”把这个数字以函数返回值的形式传给“$?”
[root@nfs-server ~]# sed -n '63,73p' /etc/init.d/rpcbind stop() { echo -n $"Stopping $prog: " killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && { rm -f /var/lock/subsys/$prog rm -f /var/run/rpcbind* } return $RETVAL }
3.3 bash shell 内置变量命令
常用的内置命令:echo、eval、exec、export、read、shift
echo 在屏幕上输出信息
echo的参数信息说明
-n 不换行输出内容
-e 解析转义字符
转义字符:
\n 换行;
\r 回车;
\t 制表符(tab);
\b 退格;
\v 纵向制表符
eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
[root@wangxian script]# cat noeval.sh echo \$$# [root@wangxian script]# sh noeval.sh x1 x2 $2 [root@wangxian script]# cat eval.sh eval "echo \$$# " [root@wangxian script]# sh eval.sh x1 x2 x2
exec
功能:exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程(最初的shell)就终止了
read
从标准输入读取字符串等信息,传给shell程序内部定义的变量
shift
功能:shift命令的作用是将位置参数$1、$2、$3等进行左移,执行一次删除一个参数
exit
退出shell程序,在exit之后可以有选择地指定一个数位作为返回状态
3.4 shell变量子串知识及实践提取
变量子串介绍与实践
ID | 表达式 | 说明 |
1 | ${parameter} | 返回变量$parameter的内容 |
2 | ${#parameter} | 返回变量$parameter内容的长度,也适用于特殊变量 |
3 | ${parameter:offset} | 在变量${parameter}中,从位置offset之后开始提取子串到结尾 |
4 | ${parameter:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为length的子串 |
5 | ${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 |
6 | ${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 |
7 | ${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 |
8 | ${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 |
9 | ${parameter/pattern/string} | 使用string代替第一个匹配的pattern |
10 | ${parameter//pattern/string} | 使用string代替所有匹配的pattern |
打印变量值的长度
[root@wangxian script]# OLDBOY="I am wangxian" [root@wangxian script]# echo ${OLDBOY} I am wangxian [root@wangxian script]# echo ${#OLDBOY} 13
从第2个字符之后截取变量的内容
[root@wangxian script]# echo ${OLDBOY:2} am wangxian
从第2个字符之后开始截取,只截取2个字符
[root@wangxian script]# echo ${OLDBOY:2:2} am
使用oldgirl字符串代替变量$OLDBOY匹配的oldboy字符串
[root@wangxian script]# OLDBOY="I am oldboy,yes,oldboy" [root@wangxian script]# echo $OLDBOY I am oldboy,yes,oldboy [root@wangxian script]# echo ${OLDBOY/oldboy/oldgirl} I am oldgirl,yes,oldboy [root@wangxian script]# echo ${OLDBOY//oldboy/oldgirl} I am oldgirl,yes,oldgirl
变量子串应用案例
文件改名
[root@wangxian script]# touch stu_10111_finished.jpg [root@wangxian script]# f=stu_10111_finished.jpg [root@wangxian script]# echo ${f//_finished/} stu_10111.jpg [root@wangxian script]# mv $f `echo ${f//_finished/}`
3.5 shell特殊扩展变量
表达式 | 说明 |
${parameter:-word} | 如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值。 用途:如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常 |
${parameter:=word} | 如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用 用途:基本同上,但该变量又额外给parameter变量赋值了 |
${parameter:?word} | 如果parameter的变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。 用途:用于捕捉由于变量未定义而导致的错误,并退出程序 |
${parameter:+word} | 如果parameter的变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值 |
${parameter:-word}功能实践
示例1:
[root@wangxian script]# echo $test [root@wangxian script]# result=${test:-UNSET} [root@wangxian script]# echo $result UNSET [root@wangxian script]# echo ${test} [root@wangxian script]#
结论:对于${test:-UNSET},当test变量没值时,就返回变量结尾设置的UNSET字符串
示例2:
[root@wangxian script]# test=wangxian [root@wangxian script]# echo $test wangxian [root@wangxian script]# result=${test:-UNSET} [root@wangxian script]# echo $result wangxian
结论:当test变量有值时,打印result变量,返回test变量的内容
${parameter:=word}功能实践
示例:
[root@wangxian ~]# echo $test [root@wangxian ~]# result=${test:=UNSET} [root@wangxian ~]# echo $result UNSET [root@wangxian ~]# echo $test UNSET
结论:当变量值result里test没有定义时,会给变量result赋值“:=”后面的内容,同时会把内容赋值给test
${parameter:?word}功能实践
示例:
[root@wangxian ~]# echo ${key:?not defined} -bash: key: not defined [root@wangxian ~]# echo ${key?not defined} -bash: key: not defined [root@wangxian ~]# key=1 [root@wangxian ~]# echo ${key:?not defined} 1 [root@wangxian ~]# echo ${key?not defined} 1
结论:当key没定义时,报错;可以用于设定由于变量未定义而报错的具体内容,如:not defined
${parameter:+word}功能实践
示例:
[root@wangxian ~]# xianren=${wangxian:+word} [root@wangxian ~]# echo $xianren [root@wangxian ~]# wangxian=22 [root@wangxian ~]# xianren=${wangxian:+word} [root@wangxian ~]# echo $xianren word [root@wangxian ~]# xianren=${wangxian:+this is ok} [root@wangxian ~]# echo $xianren this is ok
此功能可用于测试变量(wangxian的位置)是否存在,如果xianren的值有,则证明wangxian变量有值