在我的shell脚本中有一个来自某些系统的参数,它给出了类似于下面这个的答案:PAR0000008。我只需要将这个参数的最后一个数字发送给另一个变量,即VAR=8。我使用命令VAR=$( echo ${PAR} | cut -c 10 )
,它工作得很好。当PAR参数返回两个小数点后的数字(如PAR0000012)时,问题就出现了。我需要丢弃前导零,只将数字12发送给变量,但我不知道如何在Shell中执行逻辑以丢弃数字左侧的所有字符。
编辑使用grep
处理0作为最终数字的一部分
由于您正在使用POSIX shell,因此使用sed
或grep
(或cut
)之类的实用程序是有意义的。grep
在解析字符串方面更加灵活,允许REGEX匹配来处理该任务。假设您的变量v=PAR0312012
,您想要的结果是r=312012
。您可以使用命令替换(例如$(...)
)来解析将结果分配给r
的值,例如
v=PAR0312012
r=$(echo $v | grep -Eo '[1-9].*$')
echo $r
grep
表达式为:
-Eo
-使用扩展REGEX,只返回字符串的匹配部分,[1-9].*$
-从[1-9]
的第一个字符返回字符串的剩余部分。
这将适用于PAR0000012
或PAR0312012
(结果312012
)。
结果
ForPAR0312012
312012
使用expr
的另一个解决方案
如果变量的最后数字部分可以有0,那么必须找到第一个[1-9]
字符出现的索引,然后将从该索引开始的子字符串赋值给结果变量。
POSIX shell提供了expr
,它提供了一组字符串解析工具,可以做到这一点。所需的命令如下:
expr index string charlist
和
expr substr string start end
其中start
和end
是要从字符串中提取的起始索引和结束索引。end
只需要足够长来包含整个子字符串,所以你可以只使用字符串的总长度,例如
v=PAR0312012
ndx=$(expr index "$v" "123456789")
r=$(expr substr "$v" "$ndx" 10)
echo $r
结果
312012
这将在第一个[1-9]
之后的任何地方处理0
。
(注意:旧的expr ...
不是处理这个问题的最快方式,但如果你只关心几万个值,它会工作得很好。可能需要10亿个数字和另一种方法)
这可以很容易地使用参数扩展.
var='PAR0000008'
echo "${var##*0}"
//prints 8
echo "${var##*[^1-9]}"
//prints 8
var="${var##*0}"
echo "$var"
//prints 8
var='PAR0000012'
echo "${var##*0}"
//prints 12
echo "${var##*[^1-9]}"
//prints 12
var="${var##*[^1-9]}"
echo "$var"
//prints 12