我在这里找到了一个 bash 脚本来验证 IP 地址: http://www.linuxjournal.com/content/validating-ip-address-bash-script
当我尝试运行它时,出现错误:
test.sh: line 22: syntax error: unexpected "(" (expecting "fi")
第 22 行看起来像这样:
ip=($ip)
问题
- 这一行应该创建一个列表或数组吗?
我尝试过两种不同的 shell,但都不起作用。尝试过:
#!/bin/bash
并且
#!/bin/sh
任何建议,将不胜感激。
答案1
那:
test.sh: line 22: syntax error: unexpected "(" (expecting "fi")
不是bash
报告的错误消息。 Almquist shell 及其衍生品(如dash
busybox)报告的情况是sh
这样的:
$ grep -z '(expecting' /bin/dash
%s unexpected (expecting %s)
ash
基于 shell 不支持数组,该脚本适用于bash
(3.2 或更高版本),如 #!/bin/bash
she-bang 所示,尽管它看起来更像是bash
,zsh
和ksh93
语法之间的混合,如果它是为了检查四进制 IPv4 地址,其中部分限制为 3 位小数(例如,在 中bash
,它会给出一些错误)。008.008.008.008
使用和都能识别的标准 POSIXsh
语法,您可以这样做:dash
bash
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
。如果不这样做不会导致您的错误,但它也会使脚本无法工作。