Shell脚本中的嵌套命令和管道命令

3

我正在尝试一些测试,如下所示的shell脚本:

line="100:xx"
echo "$line" | grep -Po \\d+

结果:100

但是,

line="100:xx"
echo `echo "$line" | grep -Po \\d+`

结果为空

为什么呢?


echo "$line" 显示的值正确吗?那 line="100:xx" echo \echo "$line" | grep -Po \d+`` 呢? - filype
1
因为你正在使用反引号而不是 $(),它们很糟糕。 - user4453924
2
问题在于反斜杠的转义。尝试使用echo \echo "$line" | grep -Po \\d+`或者echo `echo "$line" | grep -Po '\d+'``(但要切换到“$()”,反引号已经过时了)。 - Biffen
感谢大家,@Biffen 的方法对我来说是正确的。 - Tiến Mạnh
2个回答

5
由于反引号允许像双引号字符串一样进行扩展,因此您的一个反斜杠被过早地消耗了:
$ echo `echo "$line" | grep -Po \\d+ | cat`

$ echo `echo "$line" | grep -Po \\\d+`
100

话虽如此,只需引用正则表达式即可

$ echo `echo "$line" | grep -Po '\d+'`
100

在正则表达式周围使用单引号是正确的方法。 - Jonathan Leffler

2

你也可以这样做:

echo $(echo "$line" | grep -Po \\d+)

为了避免反斜杠被吞噬,请使用转义字符。

真的吗?使用反引号比嵌套的带管道的POSIX表达式效果更好。 - Sandburg
@Sandburg:停止使用反引号,开始使用$()。这是新的标准... - Jahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接