2013-04-26 264 views
1

可以說我有一個嵌套循環:重命名變量在for循環

for i in $test 
do 
    name=something 

    for j in $test2 
    do 
     name2=something 
     jj=$j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g 
     if [ name == name2 ] 
     then 
     qsub scrip.sh $i $j $jj 
     fi 
    done 
done 

現在出現的問題,當我嘗試重命名變量附加$ J到變量$ JJ。在if聲明中,我只返回空值來提交腳本。是否有另一種方法來重命名變量,以便我可以將它們傳遞給if部分代碼? PS。我嘗試了3循環,但這使腳本非常緩慢。

+1

只是首先進行了縮進以使其更清晰。 – fedorqui 2013-04-26 08:29:46

回答

2

你的問題是將任務分配給sed。嘗試像

jj=$(echo $j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g) 

這使用命令替換來分配jj

+0

感謝這在6分鐘內幫助了很多,我會接受你的答案;) 我已經試圖解決這個問題幾個小時沒有意識到這也可以像你的答案一樣完成。 – 2013-04-26 08:11:31

2

這是不正確的:

jj=$j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g 

爲了一個命令的輸出分配到需要使用command substitution像這樣的變量:

jj=$(sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g <<< "$j") 

你甚至可以不使用sed,因爲bash有內置的字符串替換。例如,下面將在j變量與bar取代foo並將其分配給jj

jj=${j//foo/bar} 

還有你的if語句有問題。它應該是:

if [ "$name" == "$name2" ] 
+0

感謝您的好解釋;)爲您+1!我也改變了我的if語句。 – 2013-04-26 08:32:14

+0

忘了問你能否解釋爲什麼在if語句中需要「」 – 2013-04-26 08:40:48

+1

如果其中一個變量是空的,它會嘗試評估'[== $ name2]',這將不起作用。用引號將它與一個空字符串進行比較。 – Yossarian 2013-04-26 09:02:25

0

一點兒的小東西: 桑達的動作選擇作爲字段分隔治療後的第一個字符。 知道了這一點,你可以轉換expresion:

sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g 

到:

sed s%'tRap/tRapTrain'%'BEEML/BEEMLTrain'%g 

所以你不必擔心替代路徑時scaping你的斜線。我通常使用'%',但隨意使用任何其他角色。我認爲最佳方法是使用不可打印的字符:

SEP=$'\001' ; sed s${SEP}'tRap/tRapTrain'${SEP}'BEEML/BEEMLTrain'${SEP}g