协慌网

登录 贡献 社区

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

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

IN="[email protected];[email protected]"

现在我想把弦分开;分隔符,以便我有:

ADDR1="[email protected]"
ADDR2="[email protected]"

我不一定需要ADDR1ADDR2变量。如果它们是数组的元素甚至更好。


根据以下答案的建议,我最终得到了以下内容,这就是我所追求的:

#!/usr/bin/env bash

IN="[email protected];[email protected]"

mails=$(echo $IN | tr ";" "\n")

for addr in $mails
do
    echo "> [$addr]"
done

输出:

> [[email protected]]
> [[email protected]]

有一个涉及设置Internal_field_separator (IFS)的解决方案; 。我不确定该答案发生了什么,你如何将IFS重置为默认值?

RE: IFS解决方案,我试过这个并且它有效,我保留旧的IFS然后恢复它:

IN="[email protected];[email protected]"

OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
    echo "> [$x]"
done

IFS=$OIFS

顺便说一句,我试过的时候

mails2=($IN)

我在循环中打印它时只得到第一个字符串,没有括号围绕$IN它起作用。

答案

您可以设置内部字段分隔符 (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"

取自Bash shell 脚本拆分数组

IN="[email protected];[email protected]"
arrIN=(${IN//;/ })

说明:

这种结构取代了所有出现的';' (字符串IN的初始//表示全局替换)带有' ' (单个空格),然后将空格分隔的字符串解释为数组(这就是周围括号所做的)。

花括号内部使用的语法替换每个';'带有' '字符的字符称为参数扩展

有一些常见的问题:

  1. 如果原始字符串有空格,则需要使用IFS
    • IFS=':'; arrIN=($IN); unset IFS;
  2. 如果原始字符串包含空格分隔符是新行,则可以使用以下命令设置IFS
    • IFS=$'\n'; arrIN=($IN); unset IFS;

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

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

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