我有一个带while循环的简单脚本,但无法理解为什么它在第一行之后从$ vault_list变量中中断:
#!/bin/bash
tech_login="$1"
vault_list=$(docker exec -i tmgnt_vault_1 vault list secret/${tech_login}-terminals | sed 1,2d)
while IFS= read -r terminal
do
echo "line is $terminal"
key_values=$(docker exec -i tmgnt_vault_1 vault read secret/${tech_login}-terminals/$terminal )
done <<< "$vault_list"
如果我从while循环中删除$ key_values,它将返回回显“ line is $ terminal”中的所有值。 谁能指出我,while循环有什么问题?我认为这可能是输出问题,但不确定。
答案 0 :(得分:1)
在@choroba的提示下,我找到了$ key_values的正确语法:
key_values=$(docker exec -i tmgnt_vault_1 vault read secret/${tech_login}-terminals/$terminal <<<$terminal)
我需要将$ terminal变量显式传递给docker命令,这可以通过here字符串“ <<
答案 1 :(得分:1)
希望这对其他人有帮助。
ssh可能是吃掉stdin的命令。
是给我的。
例如while循环内的ssh导致循环在第一次迭代后退出。
LIST="cid1 10.10.0.1 host1
cid2 10.10.0.2 host1
cid3 10.10.0.3 host2"
# this while loop exits after first iteration
# ssh has eaten rest of stdin
echo "$LIST" |while read -r cid cip chost; do
echo $cid;
PSINFO=$(ssh $chost docker exec -i $cid "ps -e -orss=,pid=,args=,cmd=" |grep java );
echo PSINFO=$PSINFO;
done;
通过使用 指示ssh从/ dev / null中获取标准输入来解决:
# this while loop keeps on running
# ssh directed to take stdin from /dev/null
echo "$LIST" |while read -r cid cip chost; do
echo $cid;
PSINFO=$(ssh $chost docker exec -i $cid "ps -e -orss=,pid=,args=,cmd=" </dev/null |grep java );
echo PSINFO=$PSINFO;
done;