基本数据类型与值操作
三、变量值操作
1、获取变量值的长度
[root@web ~]# echo ${#url}
15
# 企业面试题:已知变量name="mm2021",请统计出变量中包含的字符数量
# 方法一:
[root@web ~]# echo ${#name}
6
# 方法二:
[root@mm /]# echo $name | wc -L
11
# 方法三:
[root@mm /]# echo $name|awk '{print length}'
11
# 方法四:
[root@mm ~]# expr length "$name" #length是一个函数,注意因为msg的值有空格,所以$msg必须用引号包含
12
2、切片
${paramter:offset:length}
[root@web ~]# msg="mm2021"
[root@web ~]# echo ${msg}
mm2021
[root@web ~]# echo ${msg:2} # 从2号索引开始,一直到最后
2021
[root@web ~]# echo ${msg:2:3} # 从3号索引开始,往后数2个字符
202
de
[root@mm /]# echo ${msg::3} # 从0开始,往后数3个字符
021
3、截断
# =================》一、砍掉左边的字符《=================
# 1.1 简单使用
[root@web ~]# url="www.jd.com"
[root@web ~]# echo ${#url}
10
# 1.2 结合*=》非贪婪,默认情况下*是非贪婪,尽可能地少“吃”字符
[root@web ~]# echo ${url#*w}
ww.jd.com
# 1.3 结合*=》贪婪,尽可能地多“吃”字符
[root@web ~]# echo ${url##*w} # *会尽可能多地吃掉字符,一直匹配到最远的那个w才停下来
.jd.com
# =================》二、砍掉右边的字符《=================
# 1.1 简单使用
[root@mm ~]# url="www.sina.com.cn"
[root@mm ~]# echo ${url%.cn}
www.sina.com
# 1.2 结合*=》非贪婪
[root@mm ~]# echo ${url%.*}
www.sina.com
# 1.3 结合*=》贪婪
[root@mm ~]# echo ${url%%.*}
www
# =================》三、应用示例《=================
[root@mm ~]# hostname
mm.xxx.com
[root@mm ~]# echo $HOSTNAME
mm.xxx.com
[root@mm ~]# echo ${HOSTNAME%.*}
mm.xxx
[root@mm ~]# echo ${HOSTNAME%%.*}
mm
4、内容的替换
[root@web ~]# a="www.mm.com.mc"
[root@web ~]# echo ${a/m/M}
www.Mm.com.mc
[root@web ~]# echo ${a//m/M}
www.MM.coM.Mc #贪婪
# 应用示例:批量修改文件名称
[root@web ~]# touch mm_2021_{01..03}_linux12.txt
[root@web ~]# ll
-rw-r--r-- 1 root root 0 May 31 21:31 mm_2021_01_linux12.txt
-rw-r--r-- 1 root root 0 May 31 21:31 mm_2021_02_linux12.txt
-rw-r--r-- 1 root root 0 May 31 21:31 mm_2021_03_linux12.txt
[root@mm shell]# for i in `ls *linux12.txt`;do mv $i ${i/_linux12/};done
[root@web ~]# ll
-rw-r--r-- 1 root root 0 May 31 21:31 mm_2021_01.txt
-rw-r--r-- 1 root root 0 May 31 21:31 mm_2021_02.txt
-rw-r--r-- 1 root root 0 May 31 21:31 mm_2021_03.txt
5 、变量的替代
${x:-临时变量信息}
${x:=新的变量信息}
${x:?没有设置变量提示信息}
${x:+有设置变量提示信息}
#1、${parameter-word}: 当调取变量没有定义过, 就返回word字符串信息
[root@mm ~]# unset name
[root@mm ~]# echo ${name}
[root@mm ~]# echo ${name-"mm"} # 没有定义过变量name,则使用-后的值
mm
[root@mm ~]#
[root@mm ~]# gender= # 定义过变量了,则使用变量的原值,哪怕变量的值为空值
[root@mm ~]# echo ${gender-"male"}
[root@mm ~]#
[root@mm ~]# age=18
[root@mm ~]# echo ${age-19} # 定义过变量了,则使用变量的原值
18
[root@mm ~]#
#2、${parameter:-word}: 当调取变量信息值为空时或未定义变量, 就返回word字符串信息
[root@mm ~]# unset x
[root@mm ~]# unset y
[root@mm ~]# unset z
[root@mm ~]#
[root@mm ~]# echo ${x:-aaa} # 没有定义过变量x,则使用-后的值
aaa
[root@mm ~]# y=
[root@mm ~]# echo ${y:-aaa} # 定义过变量y,但变量y的值为空值,则使用-后的值
aaa
[root@mm ~]# z=333
[root@mm ~]# echo ${z:-aaa} # 定义过变量了,并且变量有一个非空的原值,则使用变量的原值
333
#3、{parameter:=word}:当调取变量信息值为空时或未定义,则设置指定字符串为新的变量值
[root@mm /]# unset x
[root@mm /]# echo ${x:=123}
123
[root@mm /]# echo $x
123
#4、${parameter:?word}:当调取变量信息值为空时或未定义,指定为赋值的错误提示信息
[root@mm /]# unset x
[root@mm /]# echo ${x:?该变量没有定义过}
-: x: 该变量没有定义过
#5、${parameter:+word}:当调取变量信息值为空时或未定义,不做任何处理,否则word字符串将替代变量值
[root@mm /]# unset x
[root@mm /]# echo ${x:+哈哈哈}
[root@mm /]# x=123
[root@mm /]# echo ${x:+哈哈哈}
哈哈哈
6、let
# (1) 变量的值
[root@mm ~]# j=1
[root@mm ~]# let ++x
[root@mm ~]# echo $j
2
[root@mm ~]#
# (2) 表达式的值
[root@mm ~]# unset i
[root@mm ~]# unset j
[root@mm ~]# i=1
[root@mm ~]# j=1
[root@mm ~]#
[root@mm ~]# let x=i++ # 先把i赋值给x,然后再++
[root@mm ~]# let y=++j # 先++j,然后再把j的结果赋值给y
[root@mm ~]# echo $i
2
[root@mm ~]# echo $j
3
[root@mm ~]# echo $x
1
[root@mm ~]# echo $y
2
7、 取命令的结果赋值给变量:
# ``与$()
` ` 命令替换 等价于 $() 反引号中的shell命令会被先执行
[root@web ~]# touch `date +%F`_file1.txt
[root@web ~]# touch $(date +%F)_file2.txt
[root@web ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'" # 错误
[root@web ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}') # 正确
[root@web ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'` # 正确