将awk变量分配给bash变量时出错

时间:2018-08-22 10:11:08

标签: bash shell awk

变量b有一个字符串。 Awk检索我要分配给变量c的子字符串。这就是我所做的:

#!/bin/bash
b=$(llsubmit multiple.cmd)
echo $b | c=$(awk '{
ret=match($0,".in.")
rwt=match($0,"\" has")
rqt=rwt-(ret+4)
subs=substr($0,(ret+4),rqt)
}')

...但是我得到echo $c的空白输出:

1

2 个答案:

答案 0 :(得分:1)

您无法通过管道分配作业。

c=$(echo "$b" | awk '{
    ret=match($0,".in.")
    rwt=match($0,"\" has")
    rqt=rwt-(ret+4)
    subs=substr($0,(ret+4),rqt)
    }')

(请注意$b周围的引号。)

但是您的Awk脚本看起来相当复杂。而且它不会产生任何输出。它应该在最后打印一些东西吗?如果无法访问llsubmit的示例输出,这可能只是一种推测,但我猜测这样的方法可能有效:

c=$(echo "b" | sed -n 's/.*\(\.in\.[^"]*\)" has .*/\1/p')

(还要注意反斜杠以使点在字面上匹配。)

然后您也应该在echo "$c"中也使用双引号(除非您完全确定输出中不能包含任何shell元字符)。

...而且,当然,如果可以将代码重构到管道中,则通常不需要或不需要将结果存储在Shell脚本中的变量中。也许您真的在寻找类似的东西

llsubmit multiple.cmd |
sed -n 's/.*\(\.in\.[^"]\)" has .*/p' |
while read -r job; do
    : things with "$job"
done

答案 1 :(得分:0)

很难回答您的问题,因为您没有提供示例输入和预期输出,但这是您要尝试的操作:

$ b='foo .in.bar has'
$ c="${b% has*}"
$ c="${c#*.in.}"
$ echo "$c"
bar