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]
有一个解决方案是设置内部字段分隔符(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
周围加上括号就可以工作。
local IFS=...
,给予肯定;(b)不赞成使用unset IFS
,虽然我相信使用 unset IFS 会使 IFS 的行为与默认值 $' \t\n' 相同,但这似乎是一种不好的做法,因为你盲目地假设你的代码永远不会被调用时 IFS 被设置为自定义值;(c)另一个想法是调用子 shell:(IFS=$custom; ...)
,当子 shell 退出时,IFS 将返回到最初的状态。 - dubiousjimruby -e "puts ENV.fetch('PATH').split(':')"
. 如果你想保持纯 bash,那么它无法帮助你,但使用任何具有内置分割功能的脚本语言都更容易。 - ichigolasfor x in $(IFS=';';echo $IN); do echo "> [$x]"; done
- user2037659\n
更改为一个空格。因此,最终行是mails=($(echo $IN | tr ";" " "))
。现在我可以使用数组表示法mails[index]
来检查mails
的元素,或者只需在循环中迭代。 - afranques