我创建了一个bash脚本,将nmap
命令的结果插入到数组中。该脚本正在使用bash 4.3.30,但是当我尝试在bash 4.4.12上运行它时它不起作用。看起来数组是空的,或者它只有第一个值。
这是我的代码:
#!/bin/bash
declare -a IP_ARRAY
NMAP_OUTPUT=`nmap -sL $1 | grep "Nmap scan report" | awk '{print $NF}'`
read -a IP_ARRAY <<< $NMAP_OUTPUT
printf '%s\n' "${IP_ARRAY[@]}"
使用bash 4.3,字符串NMAP_OUTPUT
的值很好地复制到数组IP_ARRAY
。另一个版本没有,我没有找到错误。
字符串NMAP_OUTPUT如下所示:
10.0.0.0 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8 10.0.0.9 10.0.0.10
而不是使用上面的代码,这段代码可以运行:
IP_ARRAY=(${NMAP_OUTPUT})
我想了解我之前的代码是在处理一个版本而不是另一个版本。
非常感谢!!!
答案 0 :(得分:1)
您的脚本有多个问题可以修复。可以非常简单地完成最小化步骤。
您正在使用NMAP_OUTPUT
作为变量。 bash
shell支持可用于存储列表的数组。同样存在于变量上下文中的独立条目也经过shell完成的Word-Splitting。其结果是,如果条目之间有空格,则很难确定它是单独的单词还是整个单词的一部分。
将命令输出存储到变量中,然后解析为数组的方法很简单。您可以直接将输出传递给数组
grep
和awk
,awk
可以执行任何grep
<<< $NMAP_OUTPUT
)。如果包含空格的单词,它可能会产生不利影响。mapfile
内置 bash v4.0 on-wards的版本提供了mapfile
/ readarray
选项,可直接从文件或命令输出中读取。
您的所有脚本需求都是
mapfile -t nmapOutput < <(nmap -sL "$1" | awk '/Nmap scan report/{print $NF}')
printf '%s\n' "${nmapOutput[@]}"
我无法推断为什么您的脚本在您指出的bash
版本之间无效。我能够在bash 4.4.12
但问题的症结似乎是以错误的方式交替使用变量和数组。
答案 1 :(得分:0)
似乎你正在努力做到这一点。 为什么不简单:
IP_ARRAY=( `nmap -sL 127.1/29 | grep "Nmap scan report" | awk '{print $NF}'` )