下面的脚本将在第一个ssh命令处中断。不是出错,而是打破了while循环。使用set -vx
调试脚本将表明read -r line
不会从正在迭代的变量中读取任何其他内容。
一旦我注释掉ssh行,它将很高兴地工作并遍历整个循环。
您能在这里帮助揭开谜底吗?
谢谢!
脚本:
#!/bin/bash
set -vx
file_list=$(cat <<EOT
aaa
bbbb
ccccc
dddddd
eeeeeee
EOT
)
while read -r line; do
echo ${line}
ssh 192.168.100.222 touch /tmp/${line}
done <<< "${file_list}"
带有ssh行注释的输出(此处{set -vx
被忽略了)
aaa
bbbb
ccccc
dddddd
eeeeeee
启用ssh行的输出
aaa
答案 0 :(得分:1)
在ssh中添加选项-n
,以停止从stdin读取。
请参阅:man ssh
答案 1 :(得分:1)
使用数组而不是字符串,因此您只是在遍历数组内容,而不是依赖于能够从stdin读取的内容:
file_list=(
aaa
bbbb
ccccc
dddddd
eeeeeee
)
for file in "${file_list[@]}"; do
echo "$file"
ssh 192.168.100.222 touch "/tmp/$file"
done
为了使Google更加健壮,如何最好地用换行符分隔的字符串列表填充数组(请查找readarray
,maparray
和IFS=$'\n'
-我不记得了头顶上出现了“最好的”咒语。