为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2019-05-30 11:01:50
如何在Bash中的分隔符上拆分字符串?我将这个字符串存储在一个变量中:IN="bla@some.com;john@home.com"现在我想用;划界者使我有:ADDR1="bla@some.com"ADDR2="john@home.com"我不一定需要ADDR1和ADDR2变量。如果它们是数组的元素,那就更好了。在以下答案提出建议后,我得出以下结论:#!/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它起作用了。
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

您可以设置内场分离器(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"


查看完整回答
反对 回复 2019-05-30
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

摘自Bashshell脚本拆分数组:

IN="bla@some.com;john@home.com"arrIN=(${IN//;/ })

说明:

此构造替换所有出现在';'(首字母)//表示字符串中的全局替换)IN带着' '(一个空格),然后将空格分隔的字符串解释为数组(这就是周围的括号所做的)。

花括号内用来替换每个大括号的语法。';'字符具有' '字符称为参数展开.

有一些常见的问题:

  1. 如果原始字符串有空格,则需要使用

    IFS:

    • IFS=':'; arrIN=($IN); unset IFS;

  2. 如果原始字符串有空格

    分隔符是一个新行,您可以设置

    IFS

    有:
    • IFS=$'\n'; arrIN=($IN); unset IFS;


查看完整回答
反对 回复 2019-05-30
?
交互式爱情

TA贡献1712条经验 获得超3个赞

如果您不介意立即处理它们,我喜欢这样做:

for i in $(echo $IN | tr ";" "\n")do
  # processdone

您可以使用这种循环来初始化数组,但可能有更简单的方法。希望这能帮上忙。


查看完整回答
反对 回复 2019-05-30
  • 3 回答
  • 0 关注
  • 1397 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信