简单的bash CSV数组问题

3

我正在尝试做一些相当简单的事情,但我却无法成功。这是一个我试图处理的示例变量:

20,80,443,53

变量只是由逗号分隔的端口字符串。我需要将它们存入数组中。
5个回答

7
IFS设置为,,然后使用带here-string的read命令。
IFS=, read -r -a arr <<<"20,80,443,53"
printf "%s\n" "${arr[@]}"

20
80
443
53

2
这里有一种方法:
#!/bin/bash
v="20,80,443,53"
IFS=, a=($v) # Split
echo ${a[0]} # Display
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}

更新

感谢gniourf_gniourf指出IFS是由于赋值操作而被修改的。这里是我古怪的解决方法。现在我明白为什么其他人会采取不同的做法了。

v="20,80,443,53"

PREV_IFS="$IFS" # Save previous IFS
IFS=, a=($v)
IFS="$PREV_IFS" # Restore IFS

echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}

1
注意,这会全局设置 IFS 变量!如果你忘记了这一点,它会给你带来麻烦。 - gniourf_gniourf

1
var="20,80,442,53"
IFS=, read -ra ary <<< "$var"
printf "%s\n" "${ary[@]}"

20
80
442
53

0
Ports=('20','80','443','53');

for e in "${lic4l[@]}"; do
    echo $e

希望这能帮到你,并打印出给定变量中的端口。


这个回答是否真正回答了问题? - gniourf_gniourf
是的,它将把您所有的端口添加到一个数组中,稍后您可以用它来显示实际上是这样的:Ports=('20','80','443','53');for e in "${Ports[@]}"; do echo $e - user2448541

0

使用SED,它变成了一行代码:

a=($(sed 's/,/ /g' <<< "20,80,443,53"))

printf "%s\n" "${a[@]}"
20
80
443
53

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接