由于函数下面的行,此代码将仅在第一个匹配时运行:服务 httpd 启动但如果我删除所有 ssh... 行,它将显示所有函数的回显。有人可以向我解释一下发生了什么,也许还有一些解决方案我可以如何使用它。
#!/bin/bash
function s1 {
echo "running 1 "
ssh user@server_1_IP service httpd start
}
function s2 {
echo "running 2"
ssh user@server_2_IP service httpd start
}
function s3 {
echo "running 3"
ssh user@server_3_IP service httpd start
}
whiptail --title "Test" --checklist --separate-output "Choose:" 20 78 15 \
"Server1" "" on \
"Server2" "" on \
"Server3" "" on 2>results
while read choice
do
case $choice in
Server1) s1
;;
Server2) s2
;;
Server3) s3
;;
*)
;;
esac
done < results
答案1
在您的代码中,stdin
来自 file 的值results
同时被赋予 towhile read ...
和 to ssh
(在s1
,s2
和 中s3
)。将吃掉第一个循环中ssh
未读取的任何内容。read
尝试stdin
在循环之前保存以便稍后与 ssh 一起使用:
exec {stdin}<&0
while read choice
do
case $choice in
Server1) s1 <&$stdin ;;
Server2) s2 <&$stdin ;;
Server3) s3 <&$stdin ;;
esac
done < results
< /dev/null
或者如果您不需要 stdin 则使用ssh
.