【问题标题】:ZSH loops only over first item of the arrayZSH 仅循环数组的第一项
【发布时间】:2017-03-31 19:51:52
【问题描述】:
#/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

为什么?

【问题讨论】:

    标签: shell unix scripting zsh shebang


    【解决方案1】:

    因为你的脚本没有被 zsh 执行。修复shebang line#<strong>!</strong>/bin/zsh

    为什么即使没有 shebang 行,你的脚本还是会被执行?因为:

    1. 内核无法识别可执行格式并放弃(execve 系统调用返回ENOEXEC)。
    2. 尝试执行文件./healthcheck/zookeeper.sh 的shell 通过打开文件并注意到它看起来像可能是脚本的文本来响应。与传统不同的是,它调用/bin/sh 来执行脚本。对于/bin/sh,第一行只是一个普通的注释。

    显然/bin/sh 是您机器上的 bash 或 ksh。数组赋值使用与 zsh 相同的语法,但对数组的引用不是——在 ksh/bash 语法中,您必须编写 "${servers[@]}"(仿照 "$@")来枚举数组的元素.

    【讨论】:

    • :) 这行在我的 shell 中是灰色的,所以我错过了。最严重的错误是最明显的!谢谢吉尔!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2013-12-26
    • 2017-09-12
    相关资源
    最近更新 更多