忽略bash变量

时间:2019-01-24 04:56:09

标签: bash

我正在创建一个基本的端口扫描程序并具有扫描程序的功能,但是我正在努力添加一个用于调整超时功能的功能。如何让bash注意到$ 1和$ 2不存在,并继续在命令行输入中读取$ 3 $ 4 $ 5?这是我到目前为止所拥有的

#!/bin/bash

changetime=$1
newtime=$2
host=$3
startport=$4
stopport=$5

if [ $1 = "-t" ]
then
    timeout "$newtime"
    echo "Timeout changed to $newtime second(s)."
else
    $changetime=0
    $newtime=0
fi

如果我输入bash命令,我就能使扫描仪正常工作

./portscanner.sh -t 3 www.google.com 79 81

但是bash不喜欢我放在else后面的任何东西

1 个答案:

答案 0 :(得分:3)

尝试:

#!/bin/bash

if [ $1 = "-t" ]
then
    changetime=$1
    newtime=$2
    #timeout "$newtime"
    echo "Timeout changed to $newtime second(s)."
    shift 2
else
    changetime=0
    newtime=0
fi

host=$1
startport=$2
stopport=$3

echo "newtime=$newtime host=$host startport=$startport stopport=$stopport"

例如:

$ ./portscanner -t 3 www.google.com 79 81
Timeout changed to 3 second(s).
newtime=3 host=www.google.com startport=79 stopport=81
$ ./portscanner www.google.com 79 81
newtime=0 host=www.google.com startport=79 stopport=81

此处的关键更改是添加了shift。通过以下命令行示例,我们可以看到shift如何对参数进行操作:

$ set -- 1 2 3 4
$ echo "$@"
1 2 3 4
$ shift 2
$ echo "$@"
3 4

因此,shift 2删除了前两个参数,剩下的参数(现在已重新编号,以$1重新开始)。