Shell变量知识进阶
一、shell中特殊且重要的变量
1、特殊位置变量
在shell中存在着一些特殊且重要的变量,例如:$0、$1、$#,我们可以称之为特殊位置变量。要想从命令行、函数或脚本执行等传递参数时,就需要在Shell脚本中使用位置参数变量。
常用的特殊位置参数变量,如图:
举例说明:
$0
[root@localhost ~]# cat a.shecho $0[root@localhost ~]# sh a.sha.sh[root@localhost ~]# sh /root/a.sh/root/a.sh[root@localhost ~]# dirname /root/a.sh/root//只输出路径名称[root@localhost ~]# basename /root/a.sha.sh//只输出脚本名称
$n
[root@localhost ~]# cat a.shecho $1 $2 $3 $4 $5[root@localhost ~]# sh a.sh a b c d e fa b c d e
[root@localhost ~]# cat a.shecho $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15[root@localhost ~]# sh a.sh {a..z}a b c d e f g h i a0 a1 a2 a3 a4 a5//输出第10个位置参数时就不正常了
[root@localhost ~]# cat a.shecho $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}[root@localhost ~]# sh a.sh {a..z}a b c d e f g h i j k l m n o//这样就正常了,位置变量大于9,数字必须用"{}"括起来
$#
[root@localhost ~]# cat a.shecho $#[root@localhost ~]# sh a.sh a b c d e f6
**$***
[root@localhost ~]# cat a.shecho $*[root@localhost ~]# sh a.sh "a b" c d ea b c d e
$@
[root@localhost ~]# cat a.shecho $@[root@localhost ~]# sh a.sh "a b" c d ea b c d e f
不带引号的"$*"和"$@"输出的结果是一样的!
*"$"**
[root@localhost ~]# cat a.shfor i in "$*";do echo $i;done[root@localhost ~]# sh a.sh "a b" c d ea b c d e
"$@"
[root@localhost ~]# cat a.shfor i in "$@";do echo $i;done[root@localhost ~]# sh a.sh "a b" c d ea bcde
2、特殊状态变量
如图:
举例说明:
$?
[root@localhost ~]# pwd/root[root@localhost ~]# echo $?0[root@localhost ~]# fsdafasdfbash: fsdafasdf: 未找到命令...[root@localhost ~]# echo $?127//执行正确的命令返回值是0,不正确的是非0。
[root@localhost ~]# cat a.shif [ $# -ne 2 ] then echo "cuowu!" exit 123 //执行脚本错误时,$?的值为123fi[root@localhost ~]# sh a.shcuowu![root@localhost ~]# echo $?123
这个命令对于新手来说,非常有用!
"$?"返回值的用法:
- 判断命令、脚本或函数等程序是否执行成功;
- 若在脚本中调用执行"exit 数字",则会返回这个数字给"$?"变量;
- 如果是在函数里,则通过"return数字"把这个数字以函数返回值的形式传给"$?"变量;
剩下的有关"$$"、"$!"、"$_"不太常用,这里也不举例说明了!
二、shell内置变量命令
shell中包含一些内置命令,这些内置命令在目录列表里是看不到的,它们由shell本身提供。常用的内部命令有:echo、eval、exec、export、read、shift。接下来了解一下这些命令的功能。
echo命令
将echo命令后面指定的字符串及变量等内容显示到标准输出。
echo的常用的参数,如图:
举例说明:
[root@localhost ~]# echo one;echo twoonetwo[root@localhost ~]# echo -n one;echo twoonetwo//不换行输出[root@localhost ~]# echo -e "one\ttwo\nthree\tfour"one twothree four//之间的空隙就是"\t"的作用,"\n"换行[root@localhost ~]# echo -e "1\b23"23//"\b"的作用是退格,所以把1挡住了
关于echo命令很常用的,也没什么难度,所以就介绍这么多!
关于eval命令不太常用,本人也没怎么使用过,就不班门弄斧了!
exec命令:
exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程(也就是最初的Shell)也就终止了,示例如下:
[root@localhost ~]# exec dateSun Sep 15 12:05:22 CST 2019[lisi@localhost ~]$//退回到特权模式
read命令:
从标准输入字符串等信息,传给Shell程序内部定义的变量。
shift命令:
将位置参数$1、$2等进行左移,如果位置变量是$1、$2、$3,那执行一次shift后,$3就变成了$2,$2就变成了$1,$1也就消失了。
三、shell变量字符串
常用的选项举例:
(1)查询字符长度值
举例说明:
定义变量:
[root@localhost ~]# a=abcdef[root@localhost ~]# echo ${a}abcdef[root@localhost ~]# echo $aabcdef
返回变量值的长度
[root@localhost ~]# echo ${#a}6
扩展:
[root@localhost ~]# echo $a | wc -L6//使用wc命令统计长度[root@localhost ~]# expr length "$a"6//使用expr的length函数计算[root@localhost ~]# echo "$a" | awk '{print length($0)}'6//使用awk的length函数计算变量长度
这几张方式,最快的就是${#变量名}这种方式
(2)截取字符长度
定义变量:
[root@localhost ~]# a="a b c d e f"[root@localhost ~]# echo ${a}a b c d e f
截取变量中的内容,从第二个字符开始截取(默认截取到最后)
[root@localhost ~]# echo ${a:2}b c d e f
截取变量中的内容,从第二个字符开始截取2个字符
第一种方法:
[root@localhost ~]# echo ${a:2:4}b c//因为空格也算字符
第二种方法:
[root@localhost ~]# echo ${a} | cut -c 3-5b c
(3)删除指定字符
定义变量:
[root@localhost ~]# a=abcABC123ABCabc[root@localhost ~]# echo $aabcABC123ABCabc
[root@localhost ~]# echo ${a#a*c}ABC123ABCabc[root@localhost ~]# echo ${a#a*C}123ABCabc//从变量内容的开头开始删除最短匹配a*c及a*C的字符串
[root@localhost ~]# echo ${a##a*c}//因为全部符合要求,所以就不显示了[root@localhost ~]# echo ${a##a*C}abc//从变量内容的开头开始删除最长匹配a*c及a*C的字符串
[root@localhost ~]# echo ${a%a*c}abcABC123ABC[root@localhost ~]# echo ${a%a*C}abcABC123ABCabc//从变量内容的结尾开始删除最短匹配a*c及a*C的字符串
[root@localhost ~]# echo ${a%%a*c}[root@localhost ~]# echo ${a%%a*C}abcABC123ABCabc//从变量内容的结尾开始删除最长匹配a*c及a*C的字符串
关于删除字符的小结:
- #:表示从开头删除匹配最短;
- ##:表示从开头删除匹配最长;
- %:表示从结尾删除匹配最短;
- %%:表示从结尾删除匹配最长;
ac匹配的字符,表示所有,以a开头,以c结尾;
aC匹配的字符,表示所有,以a开头,以C结尾;
(4)替换指定字符
定义变量:
[root@localhost ~]# a="abc abc"[root@localhost ~]# echo $aabc abc
[root@localhost ~]# echo ${a/abc/ABC}ABC abc//替换第一个符合要求的字符[root@localhost ~]# echo ${a//abc/ABC}ABC ABC//替换所有符合要求的字符
有关替换的小结:
- 一个"/"表示替换匹配的第一个字符串;
- 两个"//"表示替换匹配的所有字符串;
四、特殊扩展变量
常用选项,如图:
不太常用,这里就不举例说明了!