在我的 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
)。
结果
对于PAR0312012
312012
使用expr
的另一个解决方案
如果您的变量可以包含零作为最终数字部分的一部分,那么您必须找到第一个 [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 ...
并不是处理此问题的最快方法,但如果您只关心几万个值,它会工作得很好。可能需要十亿个数字和另一种方法)
关于linux - 如何在 Shell 脚本中仅从变量返回整数并丢弃字母和前导零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69668136/