如何在Bash变量中存储多条命令(模拟cat脚本文件效果)
合并VNC远程命令到单个Bash脚本的方案
问题背景
工作中需要连接测试节点并建立VNC远程桌面连接,这一流程需按顺序执行多条命令,其中部分命令要在SSH连接建立后在远程节点运行。目前的实现方式是用单独的startVNC文件存储远程命令,执行命令如下:
cat startVNC | sed -e "s/\$scaling/$scaling/" -e "s/\$address/$address/" -e "s/\$display/$display/" | ssh -X maintain@$host
startVNC中的内容为按序执行的命令,例如:
echo "hello" sleep 1 echo "world"
该方案可用,但依赖两个独立文件,不方便分享,希望合并为单个脚本。
解决方案:用Here Document或变量实现单文件整合
方法1:Here Document(推荐)
Bash的Here Document( heredoc)可以直接在脚本中嵌入多行远程命令,同时支持本地变量替换,无需额外的sed处理,是最简洁的实现方式。
示例脚本:
#!/bin/bash # 定义本地变量 scaling="1.5" address="192.168.1.100" display=":1" host="test-node.example.com" # 通过Here Document将远程命令传递给SSH ssh -X maintain@$host << EOF echo "hello" sleep 1 echo "world" # 以下是VNC相关命令示例,替换为你的实际命令 echo "启动VNC,缩放比例:$scaling" echo "绑定地址:$address" x11vnc -display $display -scale $scaling -listen $address EOF
说明:
<< EOF和EOF是分界符,只要前后一致即可(比如换成<< CMD和CMD也可行)- 分界符
EOF不加引号时,本地变量(如$scaling)会在脚本执行时被替换为对应值,再传递给远程节点执行 - 如果需要让变量在远程节点解析(而非本地替换),可以给分界符加单引号,比如
<< 'EOF'
方法2:用变量存储远程命令
如果希望保留类似原方案的sed替换逻辑,可以将远程命令存储为一个多行变量,再通过管道传递给SSH。
示例脚本:
#!/bin/bash scaling="1.5" address="192.168.1.100" display=":1" host="test-node.example.com" # 将远程命令存储为多行变量 remote_commands=$(cat << 'END' echo "hello" sleep 1 echo "world" echo "缩放比例:$scaling" echo "绑定地址:$address" x11vnc -display $display -scale $scaling -listen $address END ) # 替换变量并传递给SSH执行 echo "$remote_commands" | sed -e "s/\$scaling/$scaling/" -e "s/\$address/$address/" -e "s/\$display/$display/" | ssh -X maintain@$host
说明:
- 用
<< 'END'可以避免本地提前替换变量,保留$scaling等占位符,之后通过sed完成替换 - 变量
remote_commands整合了原startVNC文件的所有内容,实现单文件存储
内容的提问来源于stack exchange,提问作者TomOnderwater
相关产品推荐
相关产品推荐

