Shell变量知识进阶
admin
2023-03-08 10:22:09
0

一、shell中特殊且重要的变量

1、特殊位置变量

在shell中存在着一些特殊且重要的变量,例如:$0、$1、$#,我们可以称之为特殊位置变量。要想从命令行、函数或脚本执行等传递参数时,就需要在Shell脚本中使用位置参数变量。

常用的特殊位置参数变量,如图:
Shell变量知识进阶
举例说明:
$0

[root@localhost ~]# cat a.sh
echo $0
[root@localhost ~]# sh a.sh
a.sh
[root@localhost ~]# sh /root/a.sh
/root/a.sh
[root@localhost ~]# dirname /root/a.sh
/root
//只输出路径名称
[root@localhost ~]# basename /root/a.sh
a.sh
//只输出脚本名称

$n

[root@localhost ~]# cat a.sh
echo $1 $2 $3 $4 $5
[root@localhost ~]# sh a.sh a b c d e f
a b c d e
[root@localhost ~]# cat a.sh
echo $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.sh
echo $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.sh
echo $#
[root@localhost ~]# sh a.sh a b c d e f
6

**$***

[root@localhost ~]# cat a.sh
echo $*
[root@localhost ~]# sh a.sh "a b" c d e
a b c d e

$@

[root@localhost ~]# cat a.sh
echo $@
[root@localhost ~]# sh a.sh "a b" c d e
a b c d e f

不带引号的“$*”和“$@”输出的结果是一样的!

*"$"**

[root@localhost ~]# cat a.sh
for i in "$*";do echo $i;done
[root@localhost ~]# sh a.sh "a b" c d e
a b c d e

"$@"

[root@localhost ~]# cat a.sh
for i in "$@";do echo $i;done
[root@localhost ~]# sh a.sh "a b" c d e
a b
c
d
e

2、特殊状态变量

如图:
Shell变量知识进阶

举例说明:
$?

[root@localhost ~]# pwd
/root
[root@localhost ~]# echo $?
0
[root@localhost ~]# fsdafasdf
bash: fsdafasdf: 未找到命令...
[root@localhost ~]# echo $?
127
//执行正确的命令返回值是0,不正确的是非0。
[root@localhost ~]# cat a.sh
if  
    [ $# -ne 2 ] 
then 
    echo "cuowu!"
    exit 123              //执行脚本错误时,$?的值为123
fi
[root@localhost ~]# sh a.sh
cuowu!
[root@localhost ~]# echo $?
123

这个命令对于新手来说,非常有用!

“$?”返回值的用法:

  • 判断命令、脚本或函数等程序是否执行成功;
  • 若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量;
  • 如果是在函数里,则通过“return数字”把这个数字以函数返回值的形式传给“$?”变量;

剩下的有关“$$”、“$!”、“$_”不太常用,这里也不举例说明了!

二、shell内置变量命令

shell中包含一些内置命令,这些内置命令在目录列表里是看不到的,它们由shell本身提供。常用的内部命令有:echo、eval、exec、export、read、shift。接下来了解一下这些命令的功能。

echo命令
将echo命令后面指定的字符串及变量等内容显示到标准输出。

echo的常用的参数,如图:
Shell变量知识进阶

举例说明:

[root@localhost ~]# echo one;echo two
one
two
[root@localhost ~]# echo -n one;echo two
onetwo
//不换行输出
[root@localhost ~]# echo -e "one\ttwo\nthree\tfour"
one two
three   four
//之间的空隙就是“\t”的作用,“\n”换行
[root@localhost ~]# echo -e "1\b23"
23
//“\b”的作用是退格,所以把1挡住了

关于echo命令很常用的,也没什么难度,所以就介绍这么多!

关于eval命令不太常用,本人也没怎么使用过,就不班门弄斧了!

exec命令:

exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程(也就是最初的Shell)也就终止了,示例如下:

[root@localhost ~]# exec date
Sun Sep 15 12:05:22 CST 2019
[lisi@localhost ~]$
//退回到特权模式

read命令:
从标准输入字符串等信息,传给Shell程序内部定义的变量。

shift命令:
将位置参数$1、$2等进行左移,如果位置变量是$1、$2、$3,那执行一次shift后,$3就变成了$2,$2就变成了$1,$1也就消失了。

三、shell变量字符串

常用的选项举例:
Shell变量知识进阶

(1)查询字符长度值

举例说明:
定义变量:

[root@localhost ~]# a=abcdef
[root@localhost ~]# echo ${a}
abcdef
[root@localhost ~]# echo $a
abcdef

返回变量值的长度

[root@localhost ~]# echo ${#a}
6

扩展:

[root@localhost ~]# echo $a | wc -L
6
//使用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-5
b c

(3)删除指定字符

定义变量:

[root@localhost ~]# a=abcABC123ABCabc
[root@localhost ~]# echo $a
abcABC123ABCabc
[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 $a
abc abc
[root@localhost ~]# echo ${a/abc/ABC}
ABC abc
//替换第一个符合要求的字符
[root@localhost ~]# echo ${a//abc/ABC}
ABC ABC
//替换所有符合要求的字符

有关替换的小结:

  • 一个“/”表示替换匹配的第一个字符串;
  • 两个“//”表示替换匹配的所有字符串;

四、特殊扩展变量

常用选项,如图:

Shell变量知识进阶
不太常用,这里就不举例说明了!

相关内容

热门资讯

特朗普的关键矿产战略能行吗? 5月7日,法国以G7轮值主席国身份召开线上高层会议,重点商讨在关键矿产领域对中国的遏制围堵政策。依托...
世卫组织:“洪迪厄斯”号邮轮疫... 世卫组织8日更新“洪迪厄斯”号邮轮疫情最新数据,截至5月8日,共报告8例病例,其中3例死亡病例。8例...
伊朗因储油罐已满而将石油排入海... 新华社德黑兰5月9日电 据伊朗塔斯尼姆通讯社9日凌晨报道,伊朗伊斯兰议会代表布什尔省的议员贾法尔·普...
金正恩向俄总统致贺电:平壤始终... 新华社平壤5月9日电(记者王天僚)据朝中社9日报道,朝鲜最高领导人金正恩当天向俄罗斯总统普京致贺电,...
美专家:伊朗扛不住了,或正向波... 据福克斯新闻5月8日报道,卫星图像显示,伊朗主要石油出口枢纽哈尔克岛附近出现大片疑似石油泄漏的浮油带...
黄土塬藏“算力密码”!中国电信... 在陇东黄土塬上,数字浪潮奔涌不息。作为国家 “东数西算” 工程的核心承载地,中国电信庆阳智算产业园正...
科沃斯加入清洁电器行业反虚假测... 【CNMO科技消息】5月8日,科沃斯官方微博宣布,科沃斯加入由中国家用电器协会指导、中国家电网发起成...
东华科技获得发明专利授权:“一... 证券之星消息,根据天眼查APP数据显示东华科技(002140)新获得一项发明专利授权,专利名为“一种...
头部企业扎堆超百场无人机赛事,... 文/陈聆听 2026 年 5 月 4 日,山东诸城,山东天鸟航空负责人丁总与当地多位中小学校长会面,...
重磅签约!华为、中国银联战略合... 快科技5月8日消息,华为和中国银联在深圳正式签约,进一步深化双方的战略合作,还一起发布了自主创新和人...