我有这个脚本:
nmapout=`sudo nmap -sP 10.0.0.0/24` names=`echo "$nmapout" | grep "MAC" | grep -o '(.\+)'` echo "$names"
现在$names变量包含用换行符分隔的字符串:
$names
>_ (Netgear) (Hon Hai Precision Ind. Co.) (Apple)
我尝试使用子字符串方法进行数组转换:
names=(${names//\\n/ }) echo "${names[@]}"
${names[$i]但问题是,如果我运行这个循环,我无法通过索引(即等)访问它们
${names[$i]
for (( i=0; i<${#names[@]}; i++ )) do echo "$i: ${names[$i]" # do some processing with ${names[$i]} done
我得到这个输出:
>_ 0: (Netgear) 1: (Hon 2: Hai
但我想要的是:
>_ 0: (Netgear) 1: (Hon Hai Precision Ind. Co.) 2: (Apple)
我想不出一个好的方法来做到这一点,请注意第二个字符串中有空格。
设置IFS(内部字段分隔符)。Shell 使用该IFS变量来确定字段分隔符是什么。默认情况下,IFS设置为空格字符。将其更改为换行符,如下所示:
IFS
#!/bin/bash names="Netgear Hon Hai Precision Ind. Co. Apple" SAVEIFS=$IFS # Save current IFS (Internal Field Separator) IFS=$'\n' # Change IFS to newline char names=($names) # split the `names` string into an array by the same name IFS=$SAVEIFS # Restore original IFS for (( i=0; i<${#names[@]}; i++ )) do echo "$i: ${names[$i]}" done
输出
0: Netgear 1: Hon Hai Precision Ind. Co. 2: Apple