2011-07-19 31 views
2

您好我正在写一个bash脚本,我有一个字符串拿令牌...不知道它是

foo=1.0.3

我想要做的就是检查“3 ”。我做的第一件事就是通过这样做来摆脱这段时间。 bar=echo $foo|tr '.' ' '反向回响直到最后一个单引号(不知道如何完成写作

当我做一个echo $bar它打印1 0 3.现在我该如何创建一个只包含3的变量?非常感谢你多

回答

3

正如你无疑是学习bash中,有很多很多的方式来实现自己的目标。我认为@Mat的答案使用bar=${foo##*.}是迄今为止最好的答案,尽管他没有解释如何或为什么会起作用。我强烈建议你查看bash tutorial on tldp,当我有这样的问题时,它是我的源代码。对于字符串操作,那里有一个部分discusses many of the different ways to go about this sort of thing

例如,如果你知道foo是始终将是5个字符长,你可以简单地从它拿第五个字符:

bar=${foo:4} 

也就是说,使巴foo的第五个位置(记住,我们从零开始计数,而不是从一开始)。

如果你知道它总是将是foo的最后一个位置,那么你可以指望倒退:

bar=${foo: -1} 

通知存在-1和冒号之间的空间,你需要一个(或括号)来避开负号。

为了解释@Mat的答案,我必须看看我上面提供的链接。显然,双磅符号(#号,octothorpe,无论你怎么称呼他们)在表达:

${string##substring} 

意味着从$string前删除$substring最长匹配。所以你正在寻找*.的最长匹配,相当于所有的东西都在之前。很酷,是吧?

+0

谢谢杰德。很酷。特别感谢我可以阅读的额外文档。 – Rell3oT

0

方式一:建立一个数组,并采取位置2:

array=(`echo $foo | tr . ' '`) 
echo ${array[2]} 
+0

如何在脚本中使用'echo $ {array [2]}'行。我一直试图在脚本中使用它,但它说'“(”意外“)。我需要额外的反引号或引号或双引号或parens(bash正在杀死我)。非常感谢 – Rell3oT

+0

@ Rell3ot:查看http://tldp.org/LDP/abs/html/testconstructs.html以回答有关包件和括号的问题。要回答你的问题,如果你只是分配$ {array [2]},你甚至不需要echo,你可以简单地执行'bar = $ {array [2]}'。但还有其他(或许更好)的方法可以做到,请查看其他答案。 –

2

这应该工作:

bar=$(echo $foo|cut -d. -f3) 

如果你知道你只希望最后的点(未在. - 分隔列表中的第三项)之后的部分,你也可以这样做:

bar=${foo##*.} 

优势:无需额外的过程或子shell启动。

0

这也应太:

echo $foo | awk -F. '{print $3}' 
相关问题