如何从Shell脚本中的变量只返回整数,并丢弃字母和前导零?

  • 本文关键字:整数 脚本 Shell 返回 变量 linux shell
  • 更新时间 :
  • 英文 :


在我的shell脚本中有一个来自某些系统的参数,它给出了类似于下面这个的答案:PAR0000008。我只需要将这个参数的最后一个数字发送给另一个变量,即VAR=8。我使用命令VAR=$( echo ${PAR} | cut -c 10 ),它工作得很好。当PAR参数返回两个小数点后的数字(如PAR0000012)时,问题就出现了。我需要丢弃前导零,只将数字12发送给变量,但我不知道如何在Shell中执行逻辑以丢弃数字左侧的所有字符。

编辑使用grep处理0作为最终数字的一部分

由于您正在使用POSIX shell,因此使用sedgrep(或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]的第一个字符返回字符串的剩余部分。

这将适用于PAR0000012PAR0312012(结果312012)。

结果

ForPAR0312012

312012

使用expr的另一个解决方案

如果变量的最后数字部分可以有0,那么必须找到第一个[1-9]字符出现的索引,然后将从该索引开始的子字符串赋值给结果变量。

POSIX shell提供了expr,它提供了一组字符串解析工具,可以做到这一点。所需的命令如下:

expr index string charlist

expr substr string start end

其中startend是要从字符串中提取的起始索引和结束索引。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

最新更新