我们在shell 脚本编程中,经常需要用到字符串切割,即将字符串切割为一个数组,类似java 中的split 函数,下面对几种常见的方式做一个总结。
参考文章:
shell 使用指定的分割符来分割字符串
https://blog.csdn.net/lw305080/article/details/78594011
目录
方法一: 利用shell 中 变量 的字符串替换
方法二: 设置分隔符,通过 IFS 变量
方法三: 利用tr 指令实现字符替换 (!只能针对单个分隔符)
方法一: 利用shell 中 变量 的字符串替换
原理:
${parameter//pattern/string}
用string来替换parameter变量中所有匹配的pattern
参考文章:https://blog.csdn.net/u010003835/article/details/80749220
示例:
#!/bin/bash string="hello,shell,split,test" array=(${string//,/ }) for var in ${array[@]} do echo $var done
方法二: 设置分隔符,通过 IFS 变量
原理
自定义IFS变量,改变分隔符,对字符串进行切分
参考文章:
https://blog.csdn.net/whuslei/article/details/7187639
一、IFS 介绍
Shell 脚本中有个变量叫IFS(Internal Field Seprator),内部域分隔符。完整定义是The shell uses the value stored in IFS,which is thespace,tab,and newlinecharacters by default,to delimit words for the read and set commands,when parsing output from command substitution,and when performing variable substitution.
Shell 的环境变量分为 set,env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。
而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space,newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。
二、IFS 简单实例
1、查看变量 IFS 的值。
$ echo $IFS $ echo "$IFS" | od -b 0000000 040 011 012 012 0000004直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符"\n" 。最后一个 012 是因为 echo 默认是会换行的。
示例
#!/bin/bash string="hello,test" #对IFS变量 进行替换处理 OLD_IFS="$IFS" IFS="," array=($string) IFS="$OLD_IFS" for var in ${array[@]} do echo $var done
运行结果
方法三: 利用tr 指令实现字符替换
原理
由于只是对单个字符进行的替换,则可以用 echo args | tr "oldSpilt" "newSpilt" 的方式实现。
tr 指令讲解
背景介绍
tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
语法
tr(选项)(参数)
选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
参数
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
字符集2:指定要转换成的目标字符集。
示例:
#!/bin/bash string="hello,test" array=(`echo $string | tr ',' ' '` ) for var in ${array[@]} do echo $var done