shell 变量

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则是先运算再赋值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值