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

变量拼接时被覆盖问题及Bash脚本调试求助

解决Bash脚本变量拼接被覆盖的问题

我看了你的脚本,问题其实出在输出变量时没有用双引号包裹,以及字符串拼接的写法不够健壮上。

先看你的原始脚本:当你直接echo $magenta1时,shell会把变量里的空格当作字段分隔符,输出的内容可能看起来像是被截断或者“覆盖”,但实际上变量本身的拼接是对的——只是echo的方式不对,导致你看到的结果不符合预期。

快速修复:给echo的变量加双引号

只需要修改所有echo语句,把变量用双引号包起来,就能保留变量里的完整结构和空格:

#!/bin/bash -x
runDirectory="/mnt/sequences_tmp/melody_rnn/logdir/run_"
currName=$1
magenta1="bazel run //magenta/models/melody_rnn:melody_rnn_train -- --config=attention_rnn --run_dir="
echo "$magenta1"
magenta2="$magenta1$runDirectory"
echo "$magenta2"
magenta3="$magenta2$currName"
echo "$magenta3"

当你用./your_script.sh music运行这个版本时,就能得到你期望的完整输出:

bazel run //magenta/models/melody_rnn:melody_rnn_train -- --config=attention_rnn --run_dir=
bazel run //magenta/models/melody_rnn:melody_rnn_train -- --config=attention_rnn --run_dir=/mnt/sequences_tmp/melody_rnn/logdir/run_
bazel run //magenta/models/melody_rnn:melody_rnn_train -- --config=attention_rnn --run_dir=/mnt/sequences_tmp/melody_rnn/logdir/run_music

更健壮的写法:用数组存储命令参数

如果你最终是要执行这个bazel命令,而不只是输出,我更推荐用数组来存储命令的各个参数——这种写法能完美避免空格、特殊字符带来的问题,比字符串拼接可靠得多:

#!/bin/bash -x
# 直接把参数拼接到runDirectory里,更简洁
runDirectory="/mnt/sequences_tmp/melody_rnn/logdir/run_$1"

# 用数组存储命令的各个部分
bazel_cmd=(
    bazel run //magenta/models/melody_rnn:melody_rnn_train
    --
    --config=attention_rnn
    --run_dir="$runDirectory"
)

# 输出完整命令(用[*]会把数组元素用空格连接成字符串)
echo "${bazel_cmd[*]}"

# 如果要实际执行这个命令,直接用下面这行(用[@]会保留每个参数的独立性)
# "${bazel_cmd[@]}"

这个版本不仅输出结果符合预期,就算你的参数currName里包含空格或者特殊字符(比如my music),也能正确处理,不会出现命令执行失败的情况。

内容的提问来源于stack exchange,提问作者Sev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:09:38