bash 脚本在尝试使用列表时失败

bash 脚本在尝试使用列表时失败

我在这里找到了一个 bash 脚本来验证 IP 地址: http://www.linuxjournal.com/content/validating-ip-address-bash-script

当我尝试运行它时,出现错误:

 test.sh: line 22: syntax error: unexpected "(" (expecting "fi")

第 22 行看起来像这样:

  ip=($ip)

问题

  1. 这一行应该创建一个列表或数组吗?
  2. 我尝试过两种不同的 shell,但都不起作用。尝试过:

    #!/bin/bash

并且

 #!/bin/sh

任何建议,将不胜感激。

答案1

那:

test.sh: line 22: syntax error: unexpected "(" (expecting "fi")

不是bash报告的错误消息。 Almquist shell 及其衍生品(如dashbusybox)报告的情况是sh这样的:

$ grep -z '(expecting' /bin/dash
%s unexpected (expecting %s)

ash基于 shell 不支持数组,该脚本适用于bash(3.2 或更高版本),如 #!/bin/bashshe-bang 所示,尽管它看起来更像是bash,zshksh93语法之间的混合,如果它是为了检查四进制 IPv4 地址,其中部分限制为 3 位小数(例如,在 中bash,它会给出一些错误)。008.008.008.008

使用和都能识别的标准 POSIXsh语法,您可以这样做:dashbash

valid_ip() (
  IFS=.
  set -o noglob
  set -- $1''
  [ "$#" -eq 4 ] || exit
  for i do
    case $i in
      ("" | *[!0-9]*) exit 1;;
    esac
    [ "$i" -le 255 ] || exit
  done
)

答案2

这有效:

#!/bin/bash

ip=127.0.0.1

ip=($ip)

printf 'The first IP number is "%s"\n' "${ip[0]}"

如果您在 下运行此命令bash,则说明您的脚本中存在与语句相关的其他错误if。如果您在 下运行它/bin/sh,那么它应该sh由于不了解数组而失败。

我建议您通过 ShellCheck 运行脚本https://www.shellcheck.net/

答案3

1) 这一行应该创建一个列表或数组吗?

它正在创建一个数组。首先它将 IFS 设置为.,然后显示 ip=($ip)。因此,如果您的ip=10.11.12.13数组是ip=([0]=10 [1]=11 [2]=12 [3]=13) 那么它会继续验证每个八位字节是否小于 256。

2) 这个应该使用什么shell

该脚本绝对是为 bash 创建的,因此应该在 bash 中运行。

3) 我的问题是什么

问题是您以某种方式修改了脚本,从而导致了语法错误。请准确地发布您正在运行的完整脚本,我们可以尝试找出答案。此外,正如我在评论中所说,您必须命名该脚本valid_ip.sh。如果不这样做不会导致您的错误,但它也会使脚本无法工作。

相关内容