You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:32:17