我正在尝试做一些相当简单的事情,但我却无法成功。这是一个我试图处理的示例变量:
20,80,443,53
变量只是由逗号分隔的端口字符串。我需要将它们存入数组中。
IFS
设置为,
,然后使用带here-string的read命令。IFS=, read -r -a arr <<<"20,80,443,53"
printf "%s\n" "${arr[@]}"
20
80
443
53
#!/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]}
var="20,80,442,53"
IFS=, read -ra ary <<< "$var"
printf "%s\n" "${ary[@]}"
20
80
442
53
Ports=('20','80','443','53');
for e in "${lic4l[@]}"; do
echo $e
希望这能帮到你,并打印出给定变量中的端口。
使用SED,它变成了一行代码:
a=($(sed 's/,/ /g' <<< "20,80,443,53"))
printf "%s\n" "${a[@]}"
20
80
443
53
IFS
变量!如果你忘记了这一点,它会给你带来麻烦。 - gniourf_gniourf