Parameter

如何將變數值傳遞給腳本並在一行中執行它?

  • April 15, 2018

我有一個文件(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 命令中的第一個 ‘$’ 被視為參數並被錯誤地替換有關。誰能幫我找出問題所在?

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

引用自:https://unix.stackexchange.com/questions/437933