调用 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