变量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
的空白输出:
答案 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