shell变量?用一个特定的字符串去表示不固定的内容
变量的类型:
1.自定义变量
定义变量:变量名=变量值 变量名必须以字母或下划线开头,区分大小写 如:ip1=192.168.43.166
引用变量:$变量名 或 ${变量名}
查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:unset 变量名
作用范围:仅在当前shell中有效
2.环境变量
定义环境变量:
- 方法一 export back_dir2=/home/backup
- 方法二 export ip1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 env 例如 env | grep back_dir2
取消环境变量:unset 变量名
变量作用范围: 在当前shell和子shell有效
如何在不同的脚本中公用自定义变量?
3.位置变量
- $1:第一个变量
- $2:第二个变量
- …
- ${10}:第10个变量
4.预定义变量
- $0:脚本名
- $*:所有的参数
- $@:所有的参数
- $#:参数的个数
- $$:当前进程的PID
- $!:上一个后台进程的PID
- $?:上一个命令返回值 0表示成功
变量的赋值方式:
1.显示赋值
变量名=变量值
[root@hadoop01 temp]# ip1=192.168.43.166
[root@hadoop01 temp]# echo $ip1
192.168.43.166
[root@hadoop01 temp]# school="BeiJing 1000phone"
[root@hadoop01 temp]# echo $school
BeiJing 1000phone
[root@hadoop01 temp]# today1=`date +%F`
[root@hadoop01 temp]# echo $today1
2020-05-28
[root@hadoop01 temp]# today2=$(date +%F)
[root@hadoop01 temp]# echo $today2
2020-05-28
2.read从键盘读入变量值
- read 变量名
- read -p “提示信息:” 变量名
- read -t 5 -p “提示信息:” 变量名
#-t 5 指定输入时间为5秒 - read -n 2 变量名
#-n 2指定输入字符长度为2
定义或引用变量时注意事项
“ ” 弱引用
’ ’ 强引用
[root@hadoop01 ~]# school=1000phone
[root@hadoop01 ~]# echo "${school}" is good
1000phone is good
[root@hadoop01 ~]# echo '${school}' is good
${school} is good
` ` 命令替换等价于 $() 反引号中的shell命令会被先执行
错误引用方式:
[root@hadoop01 temp]# df -Ph
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 18G 11G 5.8G 65% /
tmpfs 491M 68K 491M 1% /dev/shm
/dev/sda1 283M 37M 232M 14% /boot
[root@hadoop01 temp]# disk_free3="df -Ph|grep '/$'|awk '{print $4}'"
[root@hadoop01 temp]# echo ${disk_free3}
df -Ph|gre'/$'|awk '{print }'
正确的引用方式:
[root@hadoop01 temp]# disk_free4=$(df -Ph|grep '/$'|awk '{print $4}')
[root@hadoop01 temp]# echo ${disk_free4}
5.8G
[root@hadoop01 temp]# disk_free5=`df -Ph|grep '/$'|awk '{print $4}'`
[root@hadoop01 temp]# echo ${disk_free5}
5.8G
变量运算:
1.整数运算
方法一:expr
expr 1 + 2
expr $num1 + $num2
expr $num1 - $num2
expr $num1 \* $num2
expr $num1 / $num2
expr $num1 % $num2
方式二:$(())
#算数符: + - \* / %
[root@hadoop01 temp]# num1=1
[root@hadoop01 temp]# num2=2
[root@hadoop01 temp]# echo $((num1+num2))
3
[root@hadoop01 temp]# echo $((num1+num2))
3
[root@hadoop01 temp]# echo $((5-3*2))
-1
[root@hadoop01 temp]# echo $(((5-3)*2))
4
[root@hadoop01 temp]# echo $((2**3))
8
[root@hadoop01 temp]# sum=$((1+2));echo $sum
3
方法三:$[]
相当于$(())
[root@hadoop01 temp]# echo $[5+2]
7
[root@hadoop01 temp]# echo $[num1+num2]
3
[root@hadoop01 temp]# echo $[5**2]
25
[root@hadoop01 temp]# echo $[(5-3)*2]
4
[root@hadoop01 temp]# echo $[$num1 + $num2]
3
[root@hadoop01 temp]# echo $[5-3*2]
-1
方式四:let
[root@hadoop01 temp]# let sum=2+3;echo $sum
5
[root@hadoop01 temp]# let sum=(5-3)*2;echo $sum
4
[root@hadoop01 temp]# i=5
[root@hadoop01 temp]# let i++;echo $i
6
2.小数运算
echo ”2*4“ | bc
echo "2^4" | bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
echo "print 5.0/2" | python
注:bc表示计算器,scale表示保留的小数位数
变量"内容"的删除和替换
=”内容“的删除=
标准查看
[root@hadoop01 ~]# url=www.baidu.com.cn
[root@hadoop01 ~]# echo ${url}
www.baidu.com.cn
获取变量值的长度
[root@hadoop01 ~]# echo ${#url}
16
从前往后,最短匹配
[root@hadoop01 ~]# echo ${url#*.}
baidu.com.cn
从前往后,最长匹配,贪婪匹配
[root@hadoop01 ~]# echo ${url##*.}
cn
从后往前,最短匹配
[root@hadoop01 ~]# echo ${url%.*}
www.baidu.com
从后往前,最长匹配,贪婪匹配
[root@hadoop01 ~]# echo ${url%%.*}
www
[root@hadoop01 ~]# echo ${url#www.}
baidu.com.cn
[root@hadoop01 ~]# echo ${url#baidu} #错误删除方式
www.baidu.com.cn
[root@hadoop01 ~]# echo ${url#baidu.} #错误删除方式
www.baidu.com.cn
[root@hadoop01 ~]# echo ${url#www.baidu.}
com.cn
[root@hadoop01 ~]# echo ${url#*.bai}
du.com.cn
注:#表示从前往后删,%表示从后往前删,在进行删除时原url变量值没有改变,只收我们获得的是删除后的结果
索引及切片
[root@hadoop01 ~]# echo ${url:0:5}
www.b
[root@hadoop01 ~]# echo ${url:5:5}
aidu.
[root@hadoop01 ~]# echo ${url:5}
aidu.com.cn
变量”内容“的替换
[root@hadoop01 ~]# echo ${url/baidu/ali}
www.ali.com.cn
[root@hadoop01 ~]# echo ${url/c/N}
www.baidu.Nom.cn
[root@hadoop01 ~]# echo ${url//c/N} #贪婪替换
www.baidu.Nom.Nn
变量的替代
#申明一个变量,但未指定其值时,可以被-默认值替代
[root@hadoop01 ~]# unset var1
[root@hadoop01 ~]# echo ${var1-aaaa}
aaaa
#申明一个变量,并指定其值,则-默认值无法替代
[root@hadoop01 ~]# var2=111
[root@hadoop01 ~]# echo ${var2-bbbb}
111
#申明一个变量,并指定其值为空值,则-默认值无法替代
[root@hadoop01 ~]# var3=
[root@hadoop01 ~]# echo ${var3-cccc}
[root@hadoop01 ~]#
${变量名-新的变量值}
变量没有被赋值:会使用”新的变量值“替代
变量有被赋值(包括空值):不会被替代
${变量名:-新的变量}
变量没有被赋值(包括空值):都会被使用”新的变量值“替代
变量没有被赋值:不会被替代
i++和++i (了解)
对变量的值的影响:
[root@hadoop01 ~]# i=1
[root@hadoop01 ~]# let i++
[root@hadoop01 ~]# echo ${i}
2
[root@hadoop01 ~]# j=1
[root@hadoop01 ~]# let ++j
[root@hadoop01 ~]# echo ${j}
2
两者几乎差不多,没什么影响
对表达式的影响:
[root@hadoop01 ~]# unset i
[root@hadoop01 ~]# echo ${i}
[root@hadoop01 ~]# unset j
[root@hadoop01 ~]# i=1
[root@hadoop01 ~]# j=1
[root@hadoop01 ~]# let x=i++
[root@hadoop01 ~]# let y=++j
[root@hadoop01 ~]# echo ${i}
2
[root@hadoop01 ~]# echo ${y}
2
i++在表达式中是先赋值再运算,而++i则是先运算再赋值