2016-08-02 67 views
0

我有一个字符串,例如time=1234,我想提取=后面的数字。但是,该数字可以在0到100000的范围内(例如 - time=1,time=23,time=99999等)。在bash中查找可变长度的子字符串

我试过类似$(string:5:8}的东西,但这只适用于某个特定长度的示例。

如何获得=符号后的所有内容的子串?我宁愿在没有外部命令(如cutawk)的情况下执行此操作,因为我将在可能具有或可能不具有该功能的设备上运行此脚本。我知道有那些使用外部函数的例子,但是我正在尝试找到一个不使用这种方法的解决方案。

回答

6
s=time=1234 
time_int=${s##*=} 
echo "The content after the = in $s is $time_int" 

这是一个参数扩展匹配一切从可变的前匹配*= - 因此,一切直到并包括最后=

如果打算这是非贪婪(即,只除去内容的第一=而非最后=),用${s#*=} - 单#而不是两个。


参考文献:

2

如果time=部分constan T优可以通过使用${str#time=}

比方说,你有str='time=123123'如果执行echo ${str#time=}你会得到123123

+2

由于OP是通过使用小写的变量名以下最佳实践去掉前缀,你可能会做同样的。 –

+2

... re:“最佳实践”,请参阅http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html,定义环境变量命名的约定;因为shell变量共享一个命名空间(也就是说,例如,设置一个名为PATH的shell变量将覆盖环境变量PATH的内容),这些约定也适用于shell变量。 –

+0

感谢您根据您的建议更新,但我使用大写的原因是,它不会与时间=部分混淆:) – Fma