Bash警告 - 预期的争论

时间:2015-03-21 01:11:11

标签: linux bash if-statement

下面的bash脚本将MAC地址作为变量,并找到与该MAC地址对应的IP地址。

#!/bin/bash

read address

OUTPUT="$(nmap -sn -n /IP_ADDRESS_RANGE/ | grep -B 2 "$address" | 
grep -e ^.*[0-9].[0-9].[0-9].[0-9] |  awk '{print substr($0,22)}')"


if [ ${OUTPUT} = ""]; then
    echo "not found"
else
    echo "${OUTPUT}"
    arpspoof -i wlan1 -t ${OUTPUT} /GATEWAY/
fi

虽然它工作正常并且正如预期的那样,当我执行它时我会收到警告,并且我想知道如何修复它。输入MAC地址后得到的输出:

find.sh: 7: [: =: argument expected
/IP_ADDRESS/
**:**:**:**:*:* **:**:**:**:**:** 0806 42: arp reply 192.168.1.1 is-at **:**:**:**:*:*

2 个答案:

答案 0 :(得分:6)

有多个错误。 shellcheck发现最明显的一些:

首先,你在这里错过了一个空格:

if [ ${OUTPUT} = "" ]
                   ^--- Required

其次,您错过了所需的引用:

if [ "${OUTPUT}" = "" ]
     ^-- Here -^

这足以摆脱你所看到的错误。

以下是其他问题:

  1. 你的正则表达式试图匹配一个ipv4地址,但是匹配8个字符串,其中每个其他字符都是一个数字。

  2. 正则表达式没有引用,因此它也可能意外地匹配目录中的文件并中断grep

  3. 您使用sh yourscript运行脚本。这仅适用于sh脚本。要运行bash脚本,请使用bash yourscript

答案 1 :(得分:1)

为什么不使用:

[ -z "${OUTPUT}" ]

代替?人们也使用这样一个丑陋的伎俩:

[ "z${OUTPUT}" = "z" ]

捕捉空字符串