![如何通过 SSH 在远程主机中执行的“for 循环”中打印索引?](https://linux22.com/image/1420131/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20SSH%20%E5%9C%A8%E8%BF%9C%E7%A8%8B%E4%B8%BB%E6%9C%BA%E4%B8%AD%E6%89%A7%E8%A1%8C%E7%9A%84%E2%80%9Cfor%20%E5%BE%AA%E7%8E%AF%E2%80%9D%E4%B8%AD%E6%89%93%E5%8D%B0%E7%B4%A2%E5%BC%95%EF%BC%9F.png)
我想通过 ssh 进入远程主机,然后执行一个 for 循环,遍历数字序列来控制不同节点的数量。
ssh user@host /bin/bash << EOF
for i in {1..10}
do
echo $i
done
EOF
如果我这样做,输出只是 10 个空白行,而不是打印出从 1 到 10 的数字。
如果我在本地机器上执行相同的代码,我会得到所需的输出,即每行打印十行,从 1 到 10。
如何实现预期的功能,即在 SSH 中执行的 for 循环中访问索引?
答案1
来自bash 手册:
此处文档
此处文档的格式为:<<[-]word here-document delimiter
[...] 如果 word 中的任何字符被引用,则分隔符是 word 上引号删除的结果,并且此处文档中的行不会扩展。如果 word 未被引用,则此处文档的所有行都将进行参数扩展、命令替换和算术扩展。
让我们尝试一下:
$ i='Howdy!'
$ ssh user@localhost /bin/bash << EOF
for i in {1..10}
do
echo $i
done
EOF
Howdy!
Howdy!
Howdy!
Howdy!
Howdy!
Howdy!
Howdy!
Howdy!
Howdy!
Howdy!
$ ssh user@localhost /bin/bash << 'EOF'
for i in {1..10}
do
echo $i
done
EOF
1
2
3
4
5
6
7
8
9
10
$