调用 bash 中的函数没有给出正确的结果
Invoking the function in bash does not give the proper result
我从这篇不错的文章中获取了代码:https://catonmat.net/tcp-port-scanner-in-bash
它使用函数scan
。当我复制代码时,它对我不起作用。
我之前在 bash 函数中遇到过类似的问题,也找不到解决方案。
我尝试在脚本中以这种方式直接调用函数:
#!/bin/bash
scan() {
if [[ -z || -z ]]; then
echo "Usage: [=11=] <host> <port, ports, or port-range>"
return
fi
local host=
local ports=()
case in
*-*)
IFS=- read start end <<< ""
for ((port=start; port <= end; port++)); do
ports+=($port)
done
;;
*,*)
IFS=, read -ra ports <<< ""
;;
*)
ports+=()
;;
esac
for port in "${ports[@]}"; do
alarm 1 "echo >/dev/tcp/$host/$port" &&
echo "port $port is open" ||
echo "port $port is closed"
done
}
scan
我也试过 $(scan)
- 还是不行。
结果 - 它不想扫描任何东西(我认为我应该 运行 以调用该函数 - 代码看起来不错):
$ ./scan.sh google.com 22-99
Usage: ./scan.sh <host> <port, ports, or port-range>
$ ./scan.sh scan google.com 22-99
Usage: ./scan.sh <host> <port, ports, or port-range>
我错过了什么?这不是我第一次遇到类似的问题。
P.S。正如已经建议的那样,scan "" ""
完成了这项工作。但是,现在我从另一个函数调用这个函数时遇到了类似的问题:
function dosmth {
while test $# -gt 0; do
case "" in
-t)
shift
scan "" ""
shift
;;
*)
exit 1
;;
esac
done
}
dosmth
我也试过 dosmth "" ""
- 问题仍然存在。
现在 dosmth
函数工作正常,但 scan
的结果与之前类似,它不扫描任何东西。
$ ./dosmt.sh -t google.com 80
Usage: -t ./dosmt.sh <host> <port, ports, or port-range>
我的解决方案可能会对某人有所帮助 - 我改为:
dosmth "" "" ""
如果函数 运行 来自脚本,您需要将参数从脚本传递给函数
...
scan "" ""
当函数 运行 来自另一个函数时也是如此,您必须将参数从“父”函数传递给“子”函数。
fun1() {
echo "fun1 "
}
fun2() {
fun1 "" ""
}
fun2 "" ""
此外,根据此 args($1, $2, $3 ...) 创建具有适当名称的变量以在函数中使用也是一个好习惯。
#!/bin/bash
script=[=12=]
host=
port_range=
ports=()
scan() {
if [[ -z $host || -z $port_range ]]; then
echo "Usage: $script <host> <port, ports, or port-range>"
return
fi
case $port_range in
*-*)
IFS=- read start end <<< "$port_range"
for ((port=start; port <= end; port++)); do
ports+=($port)
done
;;
*,*)
IFS=, read -ra ports <<< "$port_range"
;;
*)
ports+=($port_range)
;;
esac
for port in "${ports[@]}"; do
alarm 1 "echo >/dev/tcp/$host/$port" &&
echo "port $port is open" ||
echo "port $port is closed"
done
}
scan
我从这篇不错的文章中获取了代码:https://catonmat.net/tcp-port-scanner-in-bash
它使用函数scan
。当我复制代码时,它对我不起作用。
我之前在 bash 函数中遇到过类似的问题,也找不到解决方案。
我尝试在脚本中以这种方式直接调用函数:
#!/bin/bash
scan() {
if [[ -z || -z ]]; then
echo "Usage: [=11=] <host> <port, ports, or port-range>"
return
fi
local host=
local ports=()
case in
*-*)
IFS=- read start end <<< ""
for ((port=start; port <= end; port++)); do
ports+=($port)
done
;;
*,*)
IFS=, read -ra ports <<< ""
;;
*)
ports+=()
;;
esac
for port in "${ports[@]}"; do
alarm 1 "echo >/dev/tcp/$host/$port" &&
echo "port $port is open" ||
echo "port $port is closed"
done
}
scan
我也试过 $(scan)
- 还是不行。
结果 - 它不想扫描任何东西(我认为我应该 运行 以调用该函数 - 代码看起来不错):
$ ./scan.sh google.com 22-99
Usage: ./scan.sh <host> <port, ports, or port-range>
$ ./scan.sh scan google.com 22-99
Usage: ./scan.sh <host> <port, ports, or port-range>
我错过了什么?这不是我第一次遇到类似的问题。
P.S。正如已经建议的那样,scan "" ""
完成了这项工作。但是,现在我从另一个函数调用这个函数时遇到了类似的问题:
function dosmth {
while test $# -gt 0; do
case "" in
-t)
shift
scan "" ""
shift
;;
*)
exit 1
;;
esac
done
}
dosmth
我也试过 dosmth "" ""
- 问题仍然存在。
现在 dosmth
函数工作正常,但 scan
的结果与之前类似,它不扫描任何东西。
$ ./dosmt.sh -t google.com 80
Usage: -t ./dosmt.sh <host> <port, ports, or port-range>
我的解决方案可能会对某人有所帮助 - 我改为:
dosmth "" "" ""
如果函数 运行 来自脚本,您需要将参数从脚本传递给函数
...
scan "" ""
当函数 运行 来自另一个函数时也是如此,您必须将参数从“父”函数传递给“子”函数。
fun1() {
echo "fun1 "
}
fun2() {
fun1 "" ""
}
fun2 "" ""
此外,根据此 args($1, $2, $3 ...) 创建具有适当名称的变量以在函数中使用也是一个好习惯。
#!/bin/bash
script=[=12=]
host=
port_range=
ports=()
scan() {
if [[ -z $host || -z $port_range ]]; then
echo "Usage: $script <host> <port, ports, or port-range>"
return
fi
case $port_range in
*-*)
IFS=- read start end <<< "$port_range"
for ((port=start; port <= end; port++)); do
ports+=($port)
done
;;
*,*)
IFS=, read -ra ports <<< "$port_range"
;;
*)
ports+=($port_range)
;;
esac
for port in "${ports[@]}"; do
alarm 1 "echo >/dev/tcp/$host/$port" &&
echo "port $port is open" ||
echo "port $port is closed"
done
}
scan