在Bash脚本中为bcftools命令传递变量参数的问题
解决Bash脚本中bcftools命令的变量替换问题
首先得指出你脚本里两个容易踩坑的地方,帮你一步步修正:
1. 变量赋值的语法错误
你原来的变量写法$infile = $1是不符合Bash语法的——变量赋值时不能有空格,而且变量名前面不需要加$(只有引用变量的时候才加)。正确的赋值方式应该是:
infile="$1" outfile="$2" pop1="$3" pop2="$4"
给变量加上双引号还能避免参数里包含空格时出现解析错误,更稳妥。
2. 单引号内的变量无法被Bash解析
你遇到的核心问题是:Bash中单引号'包裹的内容会被原样输出,不会解析变量。所以你直接把$pop1放在单引号里的话,bcftools收到的不是你传入的参数值(比如AFR_AF),而是字符串$pop1,自然会报错。
解决这个问题的关键是把变量从单引号里“解放”出来,用单引号拼接的方式让Bash正确解析变量:
bcftools view -i 'min('"$pop1"'>0) & min('"$pop2"'>0) & min('"$pop1"'<1) & min('"$pop2"'<1)' "$infile" > "$outfile"
语法解释:
'min(':用单引号包裹固定的前缀部分"$pop1":用双引号包裹变量,让Bash解析出实际传入的参数值'>0) & ...':再用单引号包裹后面的固定部分
这样拼接后,Bash会把变量替换成你传入的pop1和pop2的值,最终传递给bcftools的就是你想要的过滤表达式。
完整的正确脚本
把上面的修正整合起来,完整脚本如下:
#!/bin/bash # 正确的变量赋值 infile="$1" outfile="$2" pop1="$3" pop2="$4" # 带变量替换的bcftools命令 bcftools view -i 'min('"$pop1"'>0) & min('"$pop2"'>0) & min('"$pop1"'<1) & min('"$pop2"'<1)' "$infile" > "$outfile"
这样运行脚本时,传入的第三、第四个参数就会正确替换掉原来的AFR_AF和EUR_AF啦~
内容的提问来源于stack exchange,提问作者spiral01
相关产品推荐
相关产品推荐

