在for循环中重命名变量

时间:2013-04-26 08:02:18

标签: linux bash nested-loops

假设我有一个嵌套的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个for循环但是这使得脚本非常慢。

3 个答案:

答案 0 :(得分:2)

你的问题是把作业分配到sed。尝试像

这样的东西
jj=$(echo $j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g)

这使用命令替换来分配jj

答案 1 :(得分:2)

这是不正确的:

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

为了将命令的输出分配给变量,您需要使用command substitution,如下所示:

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

您甚至不必使用sed,因为bash具有内置字符串替换功能。例如,以下内容会将foo替换为bar变量中的j,并将其分配给jj

jj=${j//foo/bar}

你的if语句也有问题。它应该是:

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

答案 2 :(得分:0)

一个小小的东西: Sed将操作选择器后面的第一个字符视为字段分隔符。 了解这一点,你可以翻译你的表达:

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

成:

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

因此,在替换路径时,您不必担心划掉斜线。我通常使用'%',但可以随意使用任何其他角色。我认为最佳方法是使用不可打印的字符:

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