ZSH 只在数组的第一项上循环
ZSH loops only over first item of the array
#/bin/zsh
servers=('10.138.0.8' '10.138.0.91')
for srv in $servers; do
echo "Checking health for " $srv
echo "=========================================="
echo mntr | nc $srv 2181
done
当我执行时,我没有在第二个值 10.138.0.91 上循环,如下所示
[devops@devops]~% ./healthcheck/zookeeper.sh
Checking health for 10.138.0.8
==========================================
zk_version 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
zk_avg_latency 0
zk_max_latency 0
zk_min_latency 0
zk_packets_received 9
zk_packets_sent 8
zk_num_alive_connections 1
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count 4
zk_watch_count 0
zk_ephemerals_count 0
zk_approximate_data_size 27
zk_open_file_descriptor_count 28
zk_max_file_descriptor_count 4096
为什么?
因为你的脚本没有被 zsh 执行。修复shebang line:#<strong>!</strong>/bin/zsh
为什么即使没有 shebang 行,您的脚本仍然会执行?因为:
- 内核无法识别可执行格式,并放弃(
execve
系统调用returnsENOEXEC
)。
- 试图执行文件
./healthcheck/zookeeper.sh
的 shell 的响应是打开文件并注意到它看起来像可能是脚本的文本。出于传统,它调用 /bin/sh
来执行脚本。对于/bin/sh
,第一行只是一个普通的注释。
显然 /bin/sh
在您的机器上是 bash 或 ksh。数组赋值使用与 zsh 相同的语法,但对数组的引用不是——在 ksh/bash 语法中,您必须编写 "${servers[@]}"
(模仿 "$@"
)到枚举数组的元素。
#/bin/zsh
servers=('10.138.0.8' '10.138.0.91')
for srv in $servers; do
echo "Checking health for " $srv
echo "=========================================="
echo mntr | nc $srv 2181
done
当我执行时,我没有在第二个值 10.138.0.91 上循环,如下所示
[devops@devops]~% ./healthcheck/zookeeper.sh
Checking health for 10.138.0.8
==========================================
zk_version 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
zk_avg_latency 0
zk_max_latency 0
zk_min_latency 0
zk_packets_received 9
zk_packets_sent 8
zk_num_alive_connections 1
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count 4
zk_watch_count 0
zk_ephemerals_count 0
zk_approximate_data_size 27
zk_open_file_descriptor_count 28
zk_max_file_descriptor_count 4096
为什么?
因为你的脚本没有被 zsh 执行。修复shebang line:#<strong>!</strong>/bin/zsh
为什么即使没有 shebang 行,您的脚本仍然会执行?因为:
- 内核无法识别可执行格式,并放弃(
execve
系统调用returnsENOEXEC
)。 - 试图执行文件
./healthcheck/zookeeper.sh
的 shell 的响应是打开文件并注意到它看起来像可能是脚本的文本。出于传统,它调用/bin/sh
来执行脚本。对于/bin/sh
,第一行只是一个普通的注释。
显然 /bin/sh
在您的机器上是 bash 或 ksh。数组赋值使用与 zsh 相同的语法,但对数组的引用不是——在 ksh/bash 语法中,您必须编写 "${servers[@]}"
(模仿 "$@"
)到枚举数组的元素。