我遇到了一个问题,我正在比较两个文件(alert.txt和env.txt)并基于共同值,我正在根据匹配条目从env.txt中提取完整的行数据。我正在读取这些值到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循环解决这个问题,但这不是一个理想的解决方案,请引导我在正确的方向上缺少什么?
- 此处使用join而不是grep以避免误报
- 因为你的
while read
循环在你运行start_admin
之前完成,你只启动它一次(done
应该在start_admin
之后) - 在
start_admin
中,不要使用$user
,$host
等,使用$1
,$2
(或者使用它们,但在调用函数时不要将它们作为参数传递)
我不确定你到底想达到什么目的,但这里已经有一个修改过的版本了。
#!/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
)