shell处理字符串

概念

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号声明字符串

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号声明字符串

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

示例:

复制代码
#单引号和双引号使用变量的区别
root@master:~$ name='huangSir'
root@master:~$ echo '$name'
$name
root@master:~$ echo "$name"
huangSir

#单引号中嵌套单引号
root@master:~$ echo ''hello world''
hello world
#双引号中嵌套单引号
root@master:~$ echo "'hello world'"
'hello world'

#单引号和双引号使用转义字符的区别
root@master:~$ echo '\"hello world\"'
\"hello world\"
root@master:~$ echo "\"hello world\""
"hello world"

字符串的各种操作

在 Shell 脚本中,字符串是常见的数据类型,可以通过多种方式对字符串进行处理,包括拼接、截取、替换、比较等操作。

字符串拼接

字符串拼接可以直接拼接,中间无需任何特殊字符

复制代码
root@master:~$ str1="hello"
root@master:~$ str2="world"
root@master:~$ str3="$str1 $str2"
root@master:~$ echo $str3
hello world
root@master:~$ str3="${str1} like  ${str2}"
root@master:~$ echo $str3
hello like world

获取字符串长度 ${#str}

统计字符长度(变量中有多少个字符)

复制代码
#空格也算字符
root@master:~$ str="I Like Shell"
root@master:~$ echo ${#str}
12

截取字符串 ${str:index:index}

复制代码
root@master:~$ str="hello world"
# 从索引下标为5开始,向后截取,索引下标为5的舍弃
root@master:~$ echo ${str:5}
world
# 从索引下标为2开始,向后截取5个字符
root@master:~$ echo ${str:2:5}
llo w
# 从索引下标为2开始,截取到倒数第6个字符
root@master:~$ echo ${str:2:-6}
llo
从索引下标为2开始,截取到倒数第7个字符
root@master:~$ echo ${str:2:-7}
ll

字符串替换

${str/newStr/oldStr}

newStr替换为oldStr,仅替换第一个遇到的oldStr

复制代码
root@master:~$ str="hello world"
root@master:~$ echo ${str/l/o}
heolo world

${str//newStr/oldStr}

newStr替换为oldStr,替换所有的oldStr

复制代码
root@master:~$ str="hello world"
root@master:~$ echo ${str//l/o}
heooo worod

字符串大小写转换

需要bash4+的版本

大写转换:${str^^}

复制代码
root@master:~$ str="hello world"
root@master:~$ echo ${str^^}
HELLO WORLD

小写转换:${str,,}

复制代码
root@master:~$ str="HELLO WORLD"
root@master:~$ echo ${str,,}
hello world

字符串分割为数组

复制代码
root@master:~$ str="apple:banana:orange"
#按照:分割
root@master:~$ IFS=':' read -ra arr <<< "$str"
root@master:~$ echo ${arr[0]}
apple
root@master:~$ echo ${arr[1]}
banana

删除前缀或后缀

  • ${str#word}:从变量左边开始删除,按照最短匹配删除

  • ${str##word}:从变量左边开始删除,按照最长匹配删除

  • ${str%word}:从变量右边开始删除,按照最短匹配删除

  • ${str%%word}:从变量右边开始删除,按照最长匹配删除
    示例:

    root@master:~ str="file.txt.tar.gz" root@master:~ echo {str#*.} txt.tar.gz root@master:~ echo {str##*.} gz root@master:~ echo {str%.*} file.txt.tar root@master:~ echo ${str%%.*}
    file

判断是否包含子串

复制代码
if [[ $str == *World* ]]; then
  echo "包含World"
fi
# 或使用正则表达式
if [[ $str =~ .*World.* ]]; then
  echo "匹配成功"
fi

判断字符串是否为空

[[ -z "$str" ]]:为空返回真
[[ -n "$str" ]]:非空返回真

复制代码
root@master:~$ name=
root@master:~$ [[ -z "$name" ]] && echo true || echo false
true
root@master:~$ [[ -n "$name" ]] && echo true || echo false
false

判断两个字符串是否相等

[[ $str1 == $str2 ]]:相等判断
[[ $str1 != $str2 ]]: 不等判断

复制代码
root@master:~$ [[ "hello" == "hello" ]] && echo true || echo false
true
root@master:~$ [[ "hello" != "hello" ]] && echo true || echo false
false