您好我正在写一个bash脚本,我有一个字符串
foo=1.0.3
我想要做的是检查'3'。我做的第一件事是通过这样做摆脱时期。 bar=echo $foo|tr '.' ' '
带有反引号,直到最后一个单引号(不知道如何完成写作。
当我执行echo $bar
时,它打印1 0 3.现在如何创建仅包含3的变量?非常感谢你
答案 0 :(得分:2)
当你毫无疑问地学习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}
也就是说,make bar是foo的第五个位置(记住,我们从零开始计数,而不是从一个开始计算)。
如果你知道它永远是foo的最后一个位置,那么你可以倒数:
bar=${foo: -1}
注意-1
和冒号之间有一个空格,你需要那个(或括号)来逃避负号。
为了解释@Mat的答案,我不得不查看上面提供的链接。在表达式中显然是双磅符号(哈希标记,octothorpe,无论你想要什么):
${string##substring}
表示从$substring
前面删除$string
的最长匹配。因此,您正在寻找*.
的最长匹配,相当于点之前的一切。很酷,嗯?
答案 1 :(得分:1)
这应该有效:
bar=$(echo $foo|cut -d. -f3)
如果您知道您只想要最后一个点之后的部分(不是.
- 分隔列表中的第三个项目),您也可以这样做:
bar=${foo##*.}
优点:没有额外的流程或子shell开始。
答案 2 :(得分:0)
一种方法:构建数组并采取位置2:
array=(`echo $foo | tr . ' '`)
echo ${array[2]}
答案 3 :(得分:0)
这也应该有效:
echo $foo | awk -F. '{print $3}'