我将此字符串存储在变量中:
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 ";" "\n")
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周围没有括号,它可以工作。
取自Bash shell脚本拆分数组:
IN="bla@some.com;john@home.com"
arrIN=(${IN//;/ })
echo ${arrIN[1]} # Output: john@home.com
说明:
此构造将替换所有出现的“;”(首字母//表示全局替换)在字符串in中使用“”(单个空格),然后将空格分隔的字符串解释为数组(这就是周围的括号所做的)。
大括号内用于替换每个“;”的语法带有“”字符的字符称为参数扩展。
有一些常见的陷阱:
如果原始字符串有空格,则需要使用IFS:
IFS=“:”;arrIN=($IN);未设置IFS;
如果原始字符串包含空格,并且分隔符是新行,则可以使用以下命令设置IFS:
IFS=$'\n';arrIN=($IN);未设置IFS;
除了已经提供的精彩答案之外,如果只是打印数据的问题,您可以考虑使用awk:
awk -F";" '{for (i=1;i<=NF;i++) printf("> [%s]\n", $i)}' <<< "$IN"
这将字段分隔符设置为;,以便它可以用for循环遍历字段并相应地打印。
Test
$ IN="bla@some.com;john@home.com"
$ awk -F";" '{for (i=1;i<=NF;i++) printf("> [%s]\n", $i)}' <<< "$IN"
> [bla@some.com]
> [john@home.com]
使用另一个输入:
$ awk -F";" '{for (i=1;i<=NF;i++) printf("> [%s]\n", $i)}' <<< "a;b;c d;e_;f"
> [a]
> [b]
> [c d]
> [e_]
> [f]