可能“循环”和“输出”不能在我的bash脚本中正常工作

我写了下面的脚本:

#!/bin/bash echo "Reading data - headers - both" if [ $# -ne 3 ]; then echo "Usage: ./nmap <port-range> <ip-list> <d || h || b>" exit 1 fi rm -f /tmp/right.txt 1>/dev/null 2>/dev/null rm -f /tmp/wrong.txt 1>/dev/null 2>/dev/null output="" if [ $3 == h ]; then while read -r -u3 port; do while read -r -u4 ip; do # echo -en "\n$ip $port: " OUT=$( nmap -p "$port" --script=http-headers.nse "$ip" | awk 'NR>=7 && NR<=10') # [[ $OUT == *Apache* ]] && $(echo -en "$ip $port\n" >> /tmp/right.txt) || $(echo -en "$ip $port\n" >> /tmp/wrong.txt) [[ $OUT == *Apache* ]] && output="$output `echo -en "\n$ip -------------------- $port "`" && echo -e "$output" | column -t >> /tmp/right.txt || output="$output `echo -en "\n$ip -------------------- $port "`" && echo -e "$output" | column -t >> /tmp/wrong.txt done 4< "$2" done 3< "$1" echo -e "$output" | column -t elif [ $3 == d ]; then echo data elif [ $3 == b ]; then echo both fi 

我希望我的输出有两个文件:

 cat right.txt ip1 ..... port1 ip2 ..... port1 ip2 ..... port2 ip3 ..... port3 . . . cat wrong.txt ip1 ..... port1 ip2 ..... port1 ip2 ..... port2 ip3 ..... port3 . . . 

但它不能正常工作…

任何想法?

先谢谢你

请查看更新的答案,我修改了宝马的答案,请检查一下。

  #!/bin/bash echo "Reading data - headers - both" if [ $# -ne 3 ]; then echo "Usage: ./nmap <port-range> <ip-list> <d || h || b>" exit 1 fi join -j 2 $2 $1 > temp.txt headers() { while read -r ip port do printf "ip: %s port:%d \n" $ip $port OUT=$(nmap -p "$port" --script=http-headers.nse "$ip" | tac | awk -F: 'NR<=13&&/Apache/{print $2; exit}') if [[ "$OUT" == *Apache* ]]; then echo $ip $port >> /tmp/right.txt else echo $ip $port >> /tmp/wrong.txt fi done < temp.txt } case $3 in "h") headers ;; "d") echo data;; "b") echo both;; "*") echo "wrong input" exit;; esac 

你的短路逻辑是有缺陷的。 true && false || true && true true && false || true && true将执行所有四个语句。

不清楚为什么你认为echo的输出状态会指示除了成功之外的任何事情。

这更接近你的意思吗?

 output="$output `echo -en "\n$ip -------------------- $port "`" [[ $OUT == *Apache* ]] && file=/tmp/right.txt || file=/tmp/wrong.txt echo -e "$output" | column -t >>"$file" 

这仍然是错误的,因为它会多次回显累积的output ,但是至少应该告诉你需要改变什么(以及如何重构你的代码以避免重复)。

我想你实际上想要类似的东西

 [[ $OUT == *Apache* ]] && file=/tmp/right.txt || file=/tmp/wrong.txt output="$output `echo -en "\n$ip -------------------- $port " | tee -a "$file"`" 

除非这不通过column -t运行文件中的副本。 但是你可以稍后再做,或者在这里添加它,并在以后避免它(不管怎样,你似乎正在为所有的输出实例运行它)。