如何在Bash中的分隔符上拆分字符串?

如何在Bash中的分隔符上拆分字符串?

我将这个字符串存储在一个变量中:

IN="bla@some.com;john@home.com"

现在我想用;划界者使我有:

ADDR1="bla@some.com"ADDR2="john@home.com"

我不一定需要ADDR1ADDR2变量。如果它们是数组的元素,那就更好了。


在以下答案提出建议后,我得出以下结论:

#!/usr/bin/env bashIN="bla@some.com;john@home.com"mails=$(echo $IN | tr ";" "\n")for addr in $mailsdo
    echo "> [$addr]"done

产出:

> [bla@some.com]> [john@home.com]

有一个解决方案涉及到内场分离器(IFS)至;。我不知道这个答案是怎么回事,你怎么重置?IFS回到默认状态?

关于:IFS解决办法,我试过了,它成功了,我保留了旧的IFS然后恢复:

IN="bla@some.com;john@home.com"OIFS=$IFS
IFS=';'mails2=$INfor x in $mails2do
    echo "> [$x]"doneIFS=$OIFS

顺便说一句,当我试着

mails2=($IN)

只有在循环打印第一个字符串时,才得到第一个字符串,不带括号。$IN它起作用了。


狐的传说
浏览 1399回答 3
3回答

慕侠2389804

您可以设置内场分离器(IFS)变量,然后让它解析为数组。当这种情况发生在命令中时,则分配给IFS只发生在该命令的环境中(到read)。然后根据IFS变量值到数组中,然后我们可以对其进行迭代。IFS=';'&nbsp;read&nbsp;-ra&nbsp;ADDR&nbsp;<<<&nbsp;"$IN"for&nbsp;i&nbsp;in&nbsp;"${ADDR[@]}";&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;process&nbsp;"$i"done它将解析一行由;把它推到一个数组里。用于处理整个…的东西$IN,每次输入一行被;:&nbsp;while&nbsp;IFS=';'&nbsp;read&nbsp;-ra&nbsp;ADDR;&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;"${ADDR[@]}";&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;process&nbsp;"$i" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done &nbsp;done&nbsp;<<<&nbsp;"$IN"

斯蒂芬大帝

摘自Bashshell脚本拆分数组:IN="bla@some.com;john@home.com"arrIN=(${IN//;/&nbsp;})说明:此构造替换所有出现在';'(首字母)//表示字符串中的全局替换)IN带着' '(一个空格),然后将空格分隔的字符串解释为数组(这就是周围的括号所做的)。花括号内用来替换每个大括号的语法。';'字符具有' '字符称为参数展开.有一些常见的问题:如果原始字符串有空格,则需要使用IFS:IFS=':'; arrIN=($IN); unset IFS;如果原始字符串有空格和分隔符是一个新行,您可以设置IFS有:IFS=$'\n'; arrIN=($IN); unset IFS;

交互式爱情

如果您不介意立即处理它们,我喜欢这样做:for&nbsp;i&nbsp;in&nbsp;$(echo&nbsp;$IN&nbsp;|&nbsp;tr&nbsp;";"&nbsp;"\n")do &nbsp;&nbsp;#&nbsp;processdone您可以使用这种循环来初始化数组,但可能有更简单的方法。希望这能帮上忙。
打开App,查看更多内容
随时随地看视频慕课网APP