Bash脚本调用bamql时的单双引号与变量替换问题
解决Bash脚本调用bamql时变量不替换的问题
问题核心是Bash单引号会阻止变量展开,你用单引号包裹包含${CHRN}和${SNV}的字符串,导致这些变量被当作字面量传递给bamql,自然无法识别。以下是几种可行的解决方法:
方法1:将查询字符串改用双引号包裹
直接把单引号换成双引号,Bash会自动展开双引号内的变量:
bamql -f "${FILE_IN}" "chr(${CHRN}) & nt_exact(${SNV})" -o "${FILE_OUT}"
注意给所有变量(${FILE_IN}、${FILE_OUT})也加上双引号,避免文件名含空格时出现错误。
方法2:单引号+双引号拼接(适合字符串含特殊字符的场景)
如果查询字符串里有需要单引号转义的特殊字符,可以把变量部分单独用双引号包裹,和单引号部分拼接:
bamql -f "${FILE_IN}" 'chr('"${CHRN}"') & nt_exact('"${SNV}"')' -o "${FILE_OUT}"
这里'chr('是单引号包裹的字面量,"${CHRN}"是展开的变量,再拼接') & nt_exact(',最后是变量"${SNV}"和')',整体组合成正确的查询字符串。
方法3:正确使用数组传递参数
你之前的数组写法用了单引号,导致变量没展开,改用双引号定义数组元素即可:
args=("chr(${CHRN}) & nt_exact(${SNV})") bamql -f "${FILE_IN}" "${args[@]}" -o "${FILE_OUT}"
如果后续需要拆分更多参数到数组,也可以按参数拆分,但这里查询字符串是一个整体,放在一个数组元素里即可。
额外注意事项
- 确保变量
CHRN(如PB2)和SNV(如482,T)的赋值正确,没有多余空格或引号。 - 测试时可以先通过
echo命令输出完整命令,确认变量是否正确展开,比如:echo bamql -f "${FILE_IN}" "chr(${CHRN}) & nt_exact(${SNV})" -o "${FILE_OUT}"
内容的提问来源于stack exchange,提问作者Arturo
相关产品推荐
相关产品推荐

