目录
一、字符串输出
shell字符串可以用单引号|/双引号包含,也可以不用引号。具体有什么区别呢?看下面的例子:
# 定义姓名变量
name="luna"
str1="hello ${name}!" # 使用双引号
str2='hello ${name}!' # 使用单引号
str3=hello ${name}! # 不使用引号
echo ${str1}
echo ${str2}
echo ${str3}
输出结果为:
hello luna!
hello ${name}!
run.sh:行10: luna!: 未找到命令
总结:
1) 由单引号包围的字符串:
- 任何字符都会原样输出,在其中使用变量是无效的。
- 字符串中不能出现单引号,即使对单引号进行转义也不行。
2) 由双引号包围的字符串:
- 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
- 字符串中可以出现双引号,只要它被转义了就行。
3) 不被引号包围的字符串
- 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号包围的字符串一样。
- 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
一句话总结:字符串直接用双引号包围,不容易出错。
二、字符串截取
shell字符串截取分两种,一种是根据字符位置(下标)截取;另一种是从指定字符开始截取。
1.根据下标截取
格式为:${string: start :length}
string:表示源字符串
start:截取字符串的起始位置,注意第一个字符下标为0
length:截取字符串的长度
str="www.baidu.com"
# 想要输出baidu,第一个字符下标为4,字符串“baidu”长度为5
echo ${str:4:5}
# 输出结果为:
baidu
2.根据指定字符截取
这种方式无法指定截取字符串的长度,只能截取指定字符左边或者右边的所有内容。
(1)使用 # 截取指定字符右边的所有内容
格式:${string#*chars}
其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),*
是通配符的一种,表示任意长度的字符串。*chars
连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。
举个栗子:
str="http://www.baidu.com/luna"
echo ${str#*/}
# 输出结果
/www.baidu.com/luna
这里就会有一个问题,例子中字符串中有多个"/",如果我想要输出的是最后一个"/"后的所有字符,如何表示?
只需要在表达式中多加一个#,就算第一次匹配成功也不会结束,直到最后一次匹配成功。
str="http://www.baidu.com/luna"
echo ${str##*/}
# 输出结果
luna
(2)使用 % 截取指定字符左边的所有内容
格式:${string%chars*}
请注意*
的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*
应该位于 chars 的右侧。其他方面%
和#
的用法相同,这里不再赘述,仅举例说明:
str="http://www.baidu.com/luna"
echo ${str%www*}
echo ${str%/*}
echo ${str%%/*} # 此处使用了两个%
# 输出结果
http://
http://www.baidu.com
http:
三、字符串替换
1.替换一个(从左到右)
格式:${string/old/new}
string:源字符串
old:源字符串中要被替换的内容
new:新字符串
从左到右找到string中的第一个old,用new替换。
str="test.zip-test1.zip"
echo ${str/.zip/.ZIP}
# 输出结果
test.ZIP-test1.zip
2.替换一个(从右到左)
格式:${string/%old/new}
从右到左找到string中的第一个old,用new替换。
str="test.zip-test1.zip"
echo ${str/%.zip/.ZIP}
# 输出结果
test.zip-test1.ZIP
3.替换所有
格式:${string//old/new}
找到string中的所有old字符串,用new替换。
str="test.zip-test1.zip"
echo ${str//.zip/.ZIP}
# 输出结果
test.ZIP-test1.ZIP
四、字符串分割
shell字符串分割方式很多,基础使用掌握一种就够用了,个人倾向于使用awk。
日常使用场景为:按字符分割字符串,取其中第n个。
格式:echo ${str} | awk -F "分隔符" '{print $n}'
---------------- 字符串分割输出------------------------
str="www.baidu.com"
echo ${str} | awk -F "." '{print $1}'
echo ${str} | awk -F "." '{print $2}'
echo ${str} | awk -F "." '{print $3}'
# 输出结果
www
baidu
com
-----------------字符串分割赋值给变量-----------------------
str="hello java shell"
name=$(echo ${str} | awk -F " " '{print $2}')
echo ${name}
# 输出结果
java
本文参考链接:Shell字符串截取(非常详细)