如何将变量值传递给脚本并在一行中运行它?

如何将变量值传递给脚本并在一行中运行它?

我有一个包含以下几行的文件(temp_4n.in):

 5  C   172.0696  
 5  C   135.6942  
 5  H   30.9062  
 5  H   31.8124  
 12 H   31.0377  
 12 O   293.0612  
 12 H   32.4678  

我有一个脚本(testsc.txt),它将提取以某个数字开头的行的最后一个 H,我将定期更改该数字:

 grep $'^${mold}\tH' temp_4n.in | tail -1 > temp_5n.in

但是,当我使用以下命令运行脚本(例如想要以 12 开头的行)时,它会失败:

 qsub -v mold=12 ./testsc.txt

我认为这与 grep 命令中的第一个“$”被视为参数并被错误地替换有关。谁能帮我找出问题所在吗?

答案1

qsub -v varname=value设置varnamevalue提交的作业环境中提供的。

在您提交的脚本中,您在命令中使用此值grep,但包含该变量的字符串用单引号引起来,以防止 shell 扩展它。

你的脚本应该使用

grep "^$mold[[:blank:]]H" temp_4n.in | tail -1 > temp_5n.in

此处不需要$代码中的首字母( ),而是使用它来匹配空格或制表符。$'...'[[:blank:]]


另一种方法是awk在您的脚本中使用:

awk -v mold="$mold" '$1 == mold && $2 == "H" { this = $0 } END { print this }' temp_4n.in >temp_5n.in

这使用字符串比较(不是正则表达式)来测试第一列和第二列,当找到匹配行时,整行将保存在变量中this。最后,this打印 的最后一个值。这取代了greptail

相关内容