shell-基础2-字符串文本处理${}
一、为什么使用${}引用变量
1、$a和${a}的效果与区别
因为个别特殊字符会影响正常引用,所以需要使用${}引用变量,加花括号是为了帮助解释器识别变量的边界
$a和${a}效果一样,当变量后面连接其他字符的时候必须给变量加上大括号${a}_bc
[root@master ~]# VAR=111 [root@master ~]# echo $VAR11 [root@master ~]# echo $VAR 111
[root@master ~]# echo ${VAR}222 111222 [root@master ~]#
2、变量小知识补充
1)定义变量的三种方式
[root@web1 ~]# a=111 [root@web1 ~]# b='111' [root@web1 ~]# c="111" [root@web1 ~]# a=111-$a [root@web1 ~]# b='111-$a' [root@web1 ~]# c="111-$a" [root@web1 ~]# echo "a=$a" a=111-111 [root@web1 ~]# echo "c=${c}" <---$变量名表示输出变量,可以用$c或者${c}两种用法
c=111-111-111
[root@web1 ~]# echo "b=$b"
b=111-$a
[root@web1 ~]#
不加引号,当内容为简单连续的数字、字符串、路径名时,可以使用,值里面有变量会被解释后再输出
加单引号,输出变量内容时,单引号里面是啥就输出啥即使是变量或命令(命令需要反引起来),这种比较适合显示纯字符串的请看
加双引号,输出变量内容时引号里的变量及命令会经过解析后再输出内容,这种就比较适合字符串中附带有变量及命令且向将其解析后再输出的变量定义
2)把一个命令结果作为变量的内容赋值的两种方法
变量名=`ls` <---反引号引起来,缺点容易和单引号弄混
变量名=$(ls) <---可以使用这种方法
示例1
[root@web1 ~]# hh=`ls` [root@web1 ~]# echo $hh anaconda-ks.cfg bash-test Desktop Downloads google-chrome-stable_current_x86_64.rpm initial-setup-ks.cfg original-ks.cfg [root@web1 ~]# hh1=$(ls) [root@web1 ~]# echo $hh1 anaconda-ks.cfg bash-test Desktop Downloads google-chrome-stable_current_x86_64.rpm initial-setup-ks.cfg original-ks.cfg [root@web1 ~]#
3)详细参考请参见
二、字符串文本实例
1、获取字符串长度
[root@node1 ~]# HLWD='hello world!' [root@node1 ~]# echo $HLWD hello world! [root@node1 ~]# echo ${#HLWD} 12 [root@node1 ~]#
2、字符串切片
${parameter:offset}
${parameter:offset:length}
获取从offset个字符开始,向后length个字符
获取hello字符串
[root@node1 ~]# echo ${HLWD:0:5} hello 获取从第二个字符后的一个字符
[root@node1 ~]# echo ${HLWD:2:1} l 获取从第六个字符后两个字符
[root@node1 ~]# echo ${HLWD:6:2} wo
获取第五字符后面的字符 [root@node1 ~]# echo ${HLWD:6} world!
获取第五字符后面的字符 [root@node1 ~]# echo ${HLWD:5} world!
获取-1字符之后的字符
[root@node1 ~]# echo ${HLWD:-1} hello world! 获取最后一个字符
[root@node1 ~]# echo ${HLWD:(-1)} ! 获取最后两个字符
[root@node1 ~]# echo ${HLWD:(-2)} d!
获取从倒数第三个字符后的2个字符
[root@node1 ~]# echo ${HLWD:(-3):3}
ld!
[root@node1 ~]#
3、替换字符串
格式:${parameter/pattern/string}
[root@master ~]# VAR='hello world world!' 将第一个world字符串替换为WORLD [root@master ~]# echo ${VAR/world/WORLD} hello WORLD world! 将全部的world替换为WORLD [root@master ~]# echo ${VAR//world/WORLD} hello WORLD WORLD! [root@master ~]# VAR=123abc 替换正则表达式为空 [root@master ~]# echo ${VAR//[^0-9]/} 123 [root@master ~]# echo ${VAR/[0-9]/} 23abc [root@master ~]# echo ${VAR/[0-9][0-9][0-9]/} abc
4、字符串截取
格式:${parameter#word} 删除匹配前缀
${parameter##word}
${parameter%word} 删除匹配后缀
${parameter%%word}
说明:#去掉左边,最短匹配模式,##最长匹配模式
#去掉右边,最短匹配模式,%%最长匹配模式
如果变量为空就返回hello world! [root@master ~]# VAR= [root@master ~]# echo ${VAR:-'hello world!'} hello world! 如果变量不为空就返回hello world! [root@master ~]# VAR="hello" [root@master ~]# echo ${VAR:+' world!'} world! [root@master ~]# echo ${VAR:+'hello world!'} hello world! 如果变量空就重新赋值 [root@master ~]# [root@master ~]# VAR= [root@master ~]# echo ${VAR:=hello} hello [root@master ~]# echo $VAR hello 如果变量为空就将信息输出stderr [root@master ~]# VAR= [root@master ~]# echo ${VAR:?value is null } -bash: VAR: value is null
5、字符串颜色
使用方法请见shell 学习笔记8-case条件语句里面的2-3小节
参考:《shell从入门到精通》---李振良