目录

Bash 处理字符串

字符串操作

${#string} 返回$string的长度

${string:position} 在$string中,从$position位置之后开始提取子串

${string:position:length} 在$string中,从$position位置之后开始提取$length长度的子串

${string#substring} 从变量$string开头开始删除最短匹配$substring子串

${string##substring} 从变量$string开头开始删除最长匹配$sunstring子串

${string%substring} 从变量$string结尾开始删除最短匹配$substring子串

${string%%substring} 从变量$string结尾开始删除最长匹配$substring子串

注意:在进行#或##匹配时,$string的首字符必须是被删除子串$substring的第一个字符,不然无法匹配删除; 在进行%或者%%匹配时,$string的最后一个字符必须是被删除子串$substring的最后一个字符,不然无法进行删除操作;

${parameter/parttern/string} 用string来替换第一个匹配的pattern

${parameter/#parttern/string} 从开头匹配parameter变量中的pattern,匹配上后就用string来替换匹配的pattern

${parameter/%pattern/string} 从结尾开始匹配parameter变量中的pattern,匹配上后就用string替换匹配的pattern

${parameter//pattern/string} 用string来替换parameter变量中所有匹配的pattern

Bash 拆分字符串

大多数编程语言都包含内置功能“split”,可将任何字符串数据分为多个部分。但是,bash不包含此类内置函数。但是可以使用定界符在bash脚本中拆分任何字符串数据。分隔符可以是单个字符,也可以是包含多个字符的字符串。

利用 shell 中 变量 的字符串替换

${parameter//pattern/string} 用string来替换parameter变量中所有匹配的pattern

1
2
3
4
5
6
7
8
9
#!/bin/bash

str="hello,shell,split.test"
arr=(${string//,/ })
for var in ${arr[a]
do
  echo $var
done
}

使用 $IFS 变量分割

原理:自定义IFS变量, 改变分隔符, 对字符串进行切分

Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

hell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。

而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

echo "$IFS" | od -b 直接输出IFS是看不到的,把它转化为二进制就可以看到了,“040"是空格,“011"是Tab,“012"是换行符”\n” 。最后一个 012 是因为 echo 默认是会换行的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

str="hello,shell,split.test"

#对IFS变量 进行替换处理
OLD_IFS="$IFS"
IFS=","
arr=($string)
IFS="$OLD_IFS"
 
for var in ${arr[@]}
do
   echo $var
done

利用 tr 指令实现字符替换

由于只是对单个字符进行的替换,则可以用 echo args | tr "oldSpilt" "newSpilt" 的方式实现。

1
2
3
4
5
6
7
8
9
#!/bin/bash
 
str="hello,shell,split,test"
arr=(`echo $str | tr ',' ' '` )

for var in ${arr[@]}
do
   echo $var
done