第3章 shell变量知识进阶与实践

3.1 shell中的特殊位置参数变量

             常用的特殊位置参数变量说明

位置变量

作用说明

$0

获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径

$n

获取当前执行的shell脚本的第n个参数值,n=1..9,当n0时表示脚本的文件名;如果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

利用dirnamebasename命令单独获取名称或路径

[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 内置变量命令

常用的内置命令:echoevalexecexportreadshift

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

结论:当变量值resulttest没有定义时,会给变量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变量有值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章