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