このコードは、関数の下の行のため、最初の一致に対してのみ実行されます:service httpd startただし、すべての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
コードでは、ファイルstdin
に由来するresults
がwhile read ...
とssh
の両方に与えられます(s1
、s2
およびs3
)。 ssh
は、最初のループでread
によって読み取られなかったものをすべて食べます。
後でsshで使用するために、ループの前にstdin
を保存してみてください。
exec {stdin}<&0
while read choice
do
case $choice in
Server1) s1 <&$stdin ;;
Server2) s2 <&$stdin ;;
Server3) s3 <&$stdin ;;
esac
done < results
または、ssh
にstdinが必要ない場合は、< /dev/null
を使用します。