文章目录
问题
我将这个字符串存储在一个变量中:
IN="bla@some.com;john@home.com"
现在我想用 ;
分隔符分割字符串,以便我得到:
ADDR1="bla@some.com"
ADDR2="john@home.com"
我不是必须需要变量 ADDR1
和 ADDR2
。如果它们是数组中的元素就更好了。
回答1
你可以设置内部字段分隔符 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"
回答2
摘自 Bash shell script split array:
IN="bla@some.com;john@home.com"
arrIN=(${IN//;/ })
echo ${arrIN[1]} # Output: john@home.com
解释:
这种结构将字符串 IN
中出现的所有 ;
(开头的 //
表示全局替换)替换为 ’ '(一个空格),然后将以空格分隔的字符串解释为一个数组(这就是圆括号的作用)。
在大括号内将每个 ;
字符替换为 ’ ’ 字符的语法称为参数扩展 Parameter Expansion。
这里有一些常见的陷阱:
- 如果原始字符串包含空格,你将需要使用
IFS
:
IFS=':'; arrIN=($IN); unset IFS;
- 如果原始字符串中包含空格,且分隔符是新行,则可以使用以下方式设置
IFS
:
IFS=$'\n'; arrIN=($IN); unset IFS;
参考:
- stackoverflow question 918886
相关阅读:
- 如何在Bash中连接字符串变量
- 在Bash中如何检查字符串是否包含子字符串
- sh和Bash的区别
- 2>&1是什么意思
- 为什么要使用xargs命令
- xargs命令用法实例