我把这个字符串存储在一个变量中:
IN="[email protected];[email protected]"
现在我想把弦分开;
分隔符,以便我有:
ADDR1="[email protected]"
ADDR2="[email protected]"
我不一定需要ADDR1
和ADDR2
变量。如果它们是数组的元素甚至更好。
根据以下答案的建议,我最终得到了以下内容,这就是我所追求的:
#!/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"
IN="[email protected];[email protected]"
arrIN=(${IN//;/ })
说明:
这种结构取代了所有出现的';'
(字符串IN
的初始//
表示全局替换)带有' '
(单个空格),然后将空格分隔的字符串解释为数组(这就是周围括号所做的)。
花括号内部使用的语法替换每个';'
带有' '
字符的字符称为参数扩展 。
有一些常见的问题:
如果您不介意立即处理它们,我喜欢这样做:
for i in $(echo $IN | tr ";" "\n")
do
# process
done
您可以使用这种循环来初始化数组,但可能有一种更简单的方法。但希望这会有所帮助。