How can I do bash arithmetic with variables that are numbers with leading zeroes? [duplicate]

对着背影说爱祢 提交于 2021-01-27 07:01:21

问题


I have the following code in a bash script, where "values" is a variable of newline separated numbers, some of which have leading 0's, and I am trying to iterate through each value in values and add each value to the variable "sum".

sum=0
while read line; do
    sum=$(( sum + line ))
done <<< "$values"

this code segment gives me the error: "value too great for base (error token is "09")", which as I understand, is because the bash arithmetic expression interprets the value "line" to be an octal value because it has a leading zero.

How can I allow for bash to interpret the value of line to be its decimal value? (e.g. 09 -> 9) for the value "line" within this bash arithmetic expression?


回答1:


You can override the "leading 0 means octal" by explicitly forcing base ten with 10#:

sum=$(( 10#$sum + 10#$line ))

Note that, while you can usually leave the $ off variable references in arithmetic contexts, in this case you need it. Also, if the variable has leading spaces (in front of the first "0"), it won't parse correctly.




回答2:


To trim a single leading zero:

"${line#0}"

To trim any number of leading zeros:

"${line##+(0)}"

For example:

$ line=009900
$ echo "${line##+(0)}"
9900



回答3:


You can just get rid of the leading zeros, with something like:

shopt extglob on
x="${x##+(0)}"
[[ -z "${x}" ]] && x=0

This will remove all leading zeros and then catch the case where it was all zeros (leading to an empty string), restoring it to a single zero.

The following function (and test code) will show this in action:

#!/bin/bash

stripLeadingZeros() {
    shopt -s extglob
    retVal="${1##+(0)}"
    [[ -z "${retVal}" ]] && retVal=0
    echo -n "${retVal}"
}

for testdata in 1 2 3 4 5 0 09 009 00000009 hello 00hello ; do
    result="$(stripLeadingZeros ${testdata})"
    echo "${testdata} -> ${result}"
done

The output of that is:

1 -> 1
2 -> 2
3 -> 3
4 -> 4
5 -> 5
0 -> 0
09 -> 9
009 -> 9
00000009 -> 9
hello -> hello
00hello -> hello


来源:https://stackoverflow.com/questions/53075017/how-can-i-do-bash-arithmetic-with-variables-that-are-numbers-with-leading-zeroes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!