变量拼接时被覆盖问题及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
相关产品推荐
相关产品推荐

