如何在Bash中使用分隔符拆分字符串?
如何在Bash中使用分隔符拆分字符串?
我有一个字符串存储在变量中:
IN="bla@some.com;john@home.com"
现在我想通过分隔符;
拆分字符串,使得我有:
ADDR1="bla@some.com" ADDR2="john@home.com"
我不一定需要ADDR1
和ADDR2
变量。如果它们是数组的元素,那就更好了。
在下面的回答建议之后,我得到了以下的结果,这就是我想要的:
#!/usr/bin/env bash IN="bla@some.com;john@home.com" mails=$(echo $IN | tr ";" " ") for addr in $mails do echo "> [$addr]" done
输出:
> [bla@some.com] > [john@home.com]
有一个解决方案涉及设置Internal_field_separator(IFS)为;
。我不确定那个答案发生了什么,如何将IFS
重置回默认值?
关于IFS
解决方案,我尝试了这个方法,它可以工作,我保留旧的IFS
,然后恢复它:
IN="bla@some.com;john@home.com" OIFS=$IFS IFS=';' mails2=$IN for x in $mails2 do echo "> [$x]" done IFS=$OIFS
顺便说一句,当我尝试
mails2=($IN)
在循环中打印时,只得到了第一个字符串,没有在$IN
周围加上括号,它可以工作。
admin 更改状态以发布 2023年5月21日
这段内容来自于Bash shell script split array:
IN="bla@some.com;john@home.com" arrIN=(${IN//;/ }) echo ${arrIN[1]} # Output: john@home.com
解释:
这个语法将字符串IN
中所有的';'
(初始的//
表示全局替换)替换成单个空格' '
,然后将空格分隔的字符串解释为一个数组(这就是括号的作用)。
在大括号内使用的语法,将每个';'
字符替换为' '
字符的方法被称为参数展开。
有一些常见的坑点:
- 如果原始字符串中有空格,则需要使用IFS:
IFS=':'; arrIN=($IN); unset IFS;
- 如果原始字符串中有空格,且分隔符是换行符,则可以使用IFS:
IFS=$'\n'; arrIN=($IN); unset IFS;
你可以设置内部字段分隔符(IFS)变量,然后让它解析成一个数组。当这发生在一个命令中时,那么对IFS
的赋值只会在该单个命令的环境中生效(对于read
)。然后它根据IFS
变量的值将输入解析为一个数组,我们可以遍历它。
这个例子将解析由;
分隔的一个条目行,将其推入一个数组中:
IFS=';' read -ra ADDR <<< "$IN" for i in "${ADDR[@]}"; do # process "$i" done
这个示例用于处理$IN
的整个内容,每次一个由;
分隔的输入行:
while IFS=';' read -ra ADDR; do for i in "${ADDR[@]}"; do # process "$i" done done <<< "$IN"