shell脚本学习笔记--变量(2)

变量简介

变量是任何一种编程语言都必不可少的组成部分,通常用来存放各种数据,方便之后用到时进行引用。变量对于编程的意义不亚于存储食物对于人类发展的意义,有了变量,编程就活起来了。

与其他高级编程语言不同,shell变量的声明不用声明类型,可以存储不同类型的内容,但使用时要明确变量的类型,并且区分大小写。

变量类型

与其他编程语言一样,shell中变量也分为两种,即局部变量和环境变量。

1)局部变量
局部变量只在创建它们的shell中可用,其他shell启动的程序不能访问;
在变量名前加local 可以声明其为局部变量,如:local ip

2)环境变量
环境变量可以在创建它们的shell及其派生出来的任意子进程中使用;
在变量名前加export 可以声明其为全局变量,如:export ip
命令 env 可以查看当前所有环境变量。

变量命名

  1. 变量名由数字、字母、下划线组成;
  2. 以字母或者下划线符号开始, 不能以数字开头!!!
  3. 不能使用 Shell 里的关键字,可以通过 help 命令可以查看保留关键字;

变量赋值

一个’ = ‘进行赋值,并且等号与其左边的变量名和右边的变量值不能有空隔! 这和其他编程语言有些不同,也是初学时经常犯的错误。
变量赋值支持如下三种方式:

[root@centosNode6 ~]# var1=aaa
[root@centosNode6 ~]# var2='bbb'
[root@centosNode6 ~]# var3="ccc"
[root@centosNode6 ~]# echo $var1
aaa
[root@centosNode6 ~]# echo $var2
bbb
[root@centosNode6 ~]# echo $var3
ccc

这三种赋值方式都可以,但有一定区别,请看:

[root@centosNode6 ~]# url="http://www.baidu.com"
[root@centosNode6 ~]# web1='百度:${url}'
[root@centosNode6 ~]# web2="百度:${url}"
[root@centosNode6 ~]# echo $web1
百度:${url}
[root@centosNode6 ~]# echo $web2
百度:http://www.baidu.com

以单引号’ '定义变量时,单引号不会对里面的内容进行解析,只会原样输出,变量内容中有变量命令也会把它们原样输出。这种方式适合定义不希望解析变量、命令等的场景。

以双引号" "定义变量时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义应用场景。

建议: 如果变量的内容是数字,那么可以不加引号;如果需要将变量内容原样输出可以使用单引号;其他没有特别要求的字符串等最好都加上双引号,推荐第三种,养成变量赋值加双引号的习惯。

变量引用

在变量名前加$进行变量的引用,两种变量引用的方式,如下:
1)$变量名

[root@centosNode6 ~]# var="aaa"
[root@centosNode6 ~]# echo $var
aaa

2)${变量名}

[root@centosNode6 ~]# var="aaa"
[root@centosNode6 ~]# echo ${var}
aaa

推荐使用第二种,使用第一种在写脚本的时候可能会和其他字母给搞混掉,如:

[root@centosNode6 ~]# var="Tom"
[root@centosNode6 ~]# echo $varis a good boy...
a good boy...
[root@centosNode6 ~]# echo ${var}is a good boy...
Tomis a good boy...

变量修改

变量在定义后还可以对其值进行更改重新赋值

[root@centosNode6 ~]# var="aaa"
[root@centosNode6 ~]# echo $var
aaa
[root@centosNode6 ~]# var="bbb"
[root@centosNode6 ~]# echo $var
bbb

只读变量

有些时候我们希望定义的变量不要被随意改变,这时候就可以对变量进行只读设置,即只可以读取。相当于给脚本设置只读权限。只需在变量名前加readonly 即可。

[root@centosNode6 ~]# readonly var="aaa"
[root@centosNode6 ~]# echo $var
aaa
[root@centosNode6 ~]# var="bbb"
-bash: var: readonly variable

变量删除

有些应用场景在使用完变量后希望删除,可以用命令 unset

[root@centosNode6 ~]# unset var1
[root@centosNode6 ~]# echo $var1

[root@centosNode6 ~]# 

特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。如:第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同
$? 上个命令的退出状态,或函数的返回值
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
$! 后台运行的最后一个进程的PID
$- 显示shell使用的当前选项
$_ 之前命令的最后一个参数

变量索引

和数组一样,变量有索引、长度的概念,可以通过索引获取变量中对应的字符,默认索引从0开始。

获取变量长度两种方式:
1) ${#变量名}

[root@centosNode6 ~]# echo ${#var1}
3
[root@centosNode6 ~]# var2="bbbbb"
[root@centosNode6 ~]# echo ${#var2}
5

2) expr length ${变量名}

[root@centosNode6 ~]# var1="abcd"
[root@centosNode6 ~]# echo `expr length ${var1}`
4

变量字符串截取

格式:${变量名:起始位置:长度}

[root@centosNode6 ~]# var="abcdefghigklm"
[root@centosNode6 ~]# echo ${var}  					# 变量对应的索引位置,从0开始计数
abcdefghigklm
[root@centosNode6 ~]# echo ${var:1:3}   			# 截取从索引1开始往后3个长度
bcd
[root@centosNode6 ~]# echo ${var:7}  				#截取索引7开始到最后的子串
higklm
[root@centosNode6 ~]# echo `expr index "$var" cdf`  # 找到cdf的位置
3

变量替换

有的时候需要对定义的变量部分进行替换,如下

[root@centosNode6 ~]# url=www.sina.com.cn
[root@centosNode6 ~]# echo ${url}
www.sina.com.cn
[root@centosNode6 ~]# echo ${url/sina/baidu}  		#将sina换成baidu
www.baidu.com.cn
[root@centosNode6 ~]# echo ${url/n/N}  				# 从前往后将第一个小n换成大N
www.siNa.com.cn
[root@centosNode6 ~]# echo ${url//n/N}    			#从前往后将所有小n换成大N
www.siNa.com.cN

变量字符串删除

[root@centosNode6 ~]# url=www.sina.com.cn
[root@centosNode6 ~]# echo ${url}
www.sina.com.cn
[root@centosNode6 ~]# echo ${url#*sina.}  	#从前往后,最短匹配
com.cn
[root@centosNode6 ~]# echo ${url##*.}  		#从前往后,最长匹配,贪婪匹配
cn
[root@centosNode6 ~]# echo ${url%.*}   		#从后往前, 最短匹配
www.sina.com
[root@centosNode6 ~]# echo ${url%%.*}   	#从后往前,最长匹配,贪婪匹配
www

变量运算

如果想要对数值型变量进行运算,有四种方式:

1) expr 2 + 3 推荐指数:**

[root@centosNode6 ~]# expr 5+2 
5+2
[root@centosNode6 ~]# expr 5 + 2 			#注意:三个字符要用空格隔开
7
[root@centosNode6 ~]# expr 5 - 2 
3
[root@centosNode6 ~]# expr 5 * 2 
expr: syntax error
[root@centosNode6 ~]# expr 5 \* 2  			#此命令不能识别*,必须加\,\表示转译 
10
[root@centosNode6 ~]# expr 5 / 2  			# expr只能用于整数运算
2

2) $((2+3)) 推荐指数:**

[root@centosNode6 ~]# echo $((2+3))
5
[root@centosNode6 ~]# echo $((2-3))
-1
[root@centosNode6 ~]# echo $((2*3))
6
[root@centosNode6 ~]# echo $((2/3))			# 向下取整,不能小数运算
0
[root@centosNode6 ~]# echo $((5/3))
1
[root@centosNode6 ~]# echo $((6/3))
2

2) $[2+3] 推荐指数:****

[root@centosNode6 ~]# echo $[2+3]
5
[root@centosNode6 ~]# echo $[2-3]
-1
[root@centosNode6 ~]# echo $[2*3]
6
[root@centosNode6 ~]# echo $[2/3]			# 向下取整,不能小数运算
0
[root@centosNode6 ~]# echo $[5/3]
1

3) let sum=2+3 推荐指数:*****

[root@centosNode6 ~]# let sum1=2+3
[root@centosNode6 ~]# let sum2=2-3
[root@centosNode6 ~]# let sum3=2*3
[root@centosNode6 ~]# let sum4=2/3
[root@centosNode6 ~]# let sum5=5/3
[root@centosNode6 ~]# echo ${sum1}
5
[root@centosNode6 ~]# echo ${sum2}
-1
[root@centosNode6 ~]# echo ${sum3}
6
[root@centosNode6 ~]# echo ${sum4}
0
[root@centosNode6 ~]# echo ${sum5}			# 向下取整,不能小数运算
1

小数和指数运算

1) 小数运算

[root@centosNode6 ~]# echo "2.5+2.1" | bc
4.6
[root@centosNode6 ~]# echo "2.5-2.1" | bc
.4
[root@centosNode6 ~]# echo "2.5*2.1" | bc
5.2
[root@centosNode6 ~]# echo "scale=4;2.5*2.1" | bc		# scale=4,保留4位小数
5.25
[root@centosNode6 ~]# echo "scale=5;2.5/2.1" | bc		# scale=5,保留5位小数
1.19047

2) 指数运算

[root@centosNode6 ~]#  echo "2^4"
2^4
[root@centosNode6 ~]#  echo "2^4"|bc
16
[root@centosNode6 ~]# echo $[2**4]
16

如果觉得有帮助,请点个赞哦***^ _^***

发布了3 篇原创文章 · 获赞 4 · 访问量 353

猜你喜欢

转载自blog.csdn.net/weixin_44202659/article/details/105031303
今日推荐