【问题标题】:bash select loop does not wait for inputbash 选择循环不等待输入
【发布时间】:2016-04-20 22:38:34
【问题描述】:

我试图让我的生活更轻松,在 80 多台机器上部署一些东西。但是,并非所有这些机器都运行相同版本的 RHEL,并且需要在它们上运行的脚本存在细微差别。

这就是为什么我要先获取发布版本,然后选择要在机器上部署的文件。

问题是选择循环不会等待我的输入,它会完全跳过它并继续前进。

这是我正在使用的代码

#!/bin/bash

version() {
    cat /etc/*-release | grep "release"
    select ver in "6" "7"
    do
        case $ver in
            6) echo "install for RH6"; break;;
            7) echo "install for RH7"; break;;
        esac
    done
}

while read srv
do
    ping -c 1 $srv
    ssh -n $srv "$(typeset -f); version"
done < $1

ping 只是为了测试目的

这是一些示例输出:

root@192.168.xxx.xxx's password:
Red Hat Enterprise Linux Server release 7.1 (Maipo)
Red Hat Enterprise Linux Server release 7.1 (Maipo)

1) 6
2) 7
#? 

【问题讨论】:

  • 您在本地机器上运行的 shell 中定义您的函数。远程主机不会知道。

标签: bash loops select input ssh


【解决方案1】:

select 无法读取您的输入,因为输入已经连接到文件$1(最后一行的done &lt; $1)。或者实际上是读取 OEF 或其他内容。

如果需要与脚本交互,则需要将while循环改写成不同的东西,例如

for srv in "localhost"

工作正常。

【讨论】:

  • 您可以为while read 循环使用不同的文件描述符:while read -u3 -r srv; do ...; done 3&lt;"$1" -- 然后select 可以免费使用标准输入