ssh 当使用变量形式调用时循环不起作用

ssh when invoked with variables form while loop not working

我 运行 遇到一个问题,我正在比较两个文件(alert.txt 和 env.txt)并根据共同的价值,我从 [=16] 中提取完整的行数据=] 基于匹配条目。我正在将这些值读入 while 循环,然后调用一个函数,如下所示。 ssh 调用不工作,start_admin 中的 while 循环也不工作

#!/bin/bash
start_admin()
{
ssh -n -f $user@$host "sh -c 'cd $domain; ./script.sh > /dev/null 2>&1'"
while !(netstat -na | grep -E $host:$port|grep -E LISTEN) 2>/dev/null
sleep 30
do
echo "waiting"
done
echo "started"
}

grep -Ff alert.txt env.txt | (while IFS=" " read -r r1 r2 r3 r4 r5
do
user=$r2
host=$r3
domain=$r4
port=$r5
done
start_admin $user $host $domain $port
)

and contents of alert.txt is:
env2
env3

and that of env.txt is :
env1 user1 host1 /app/domain1/ port1
env2 user2 host2 /app/domain2/ port2
env3 user3 host3 /app/domain3/ port3

我可以用多个 if else 循环来解决这个问题,但这不是理想的解决方案,请指导我正确的方向,看看缺少什么?

  1. 此处使用 join 而不是 grep 以避免误报
  2. 因为你的 while read 循环在你 运行 start_admin 之前完成,你只启动它一次(done 应该在 start_admin 之后)
  3. start_admin中,不要使用$user$host等,使用</code>、<code>(或使用但不使用)调用函数时不要将它们作为参数传递)

我不确定你到底想达到什么目的,但这里已经是修订版了。

#!/bin/bash
start_admin()
{
  sanitized_domain=${domain//'"'/'\"'}
  ssh -n -f "$user@$host" "sh -c 'cd \"$sanitized_domain\"; ./script.sh >/dev/null 2>&1'"
  while ! netstat -na | grep -q " $host:$port .*LISTEN"; do
    echo waiting
    sleep 30
  done
  echo started
}

join alert.txt env.txt | while IFS=' ' read -r env user host domain port; do
  start_admin
done
)