我有这个脚本 -
nmapout=`sudo nmap -sP 10.0.0.0/24`
names=`echo "$nmapout" | grep "MAC" | grep -o '(.\+)'`
echo "$names"
现在$names
变量包含用换行符分隔的字符串 -
>_
(Netgear)
(Hon Hai Precision Ind. Co.)
(Apple)
我尝试使用子字符串方法进行数组转换 -
names=(${names//\\n/ })
echo "${names[@]}"
但问题是我无法通过索引(即${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)
我无法找到一个好方法,请注意第二个字符串中有空格。
有什么想法吗?
答案 0 :(得分:23)
设置IFS
。 Shell使用IFS
变量来确定字段分隔符。默认情况下,IFS
设置为空格字符。将其更改为换行符。
#!/bin/bash
names="Netgear
Hon Hai Precision Ind. Co.
Apple"
SAVEIFS=$IFS # Save current IFS
IFS=$'\n' # Change IFS to new line
names=($names) # split to array $names
IFS=$SAVEIFS # Restore IFS
for (( i=0; i<${#names[@]}; i++ ))
do
echo "$i: ${names[$i]}"
done
输出
0: Netgear
1: Hon Hai Precision Ind. Co.
2: Apple
答案 1 :(得分:9)
让我为Sanket Parmar's answer做出贡献。如果您可以将字符串拆分和处理提取到单独的函数中,则无需保存和恢复cudaMemcpy(host, device, size * sizeof(int), cudaMemcpyDevicetoHost)
- 请改为使用$IFS
:
local
另见:
答案 2 :(得分:1)
Bash还具有readarray
内置命令,可在手册页中轻松搜索。它使用换行符(\n
)作为默认定界符,并使用MAPFILE
作为默认数组,因此可以这样做:
names="Netgear
Hon Hai Precision Ind. Co.
Apple"
readarray -t <<<$names
printf "0: ${MAPFILE[0]}\n1: ${MAPFILE[1]}\n2: ${MAPFILE[2]}\n"
-t
选项删除定界符('\n'
),以便可以在printf
中显式添加定界符。输出为:
0: Netgear
1: Hon Hai Precision Ind. Co.
2: Apple
答案 3 :(得分:0)
正如其他人所说,IFS将为您提供帮助。IFS=$'\n' read -ra array <<< "$names"
如果您的变量的字符串带有空格,请将其放在双引号之间。
现在,您可以通过{array[@]}