mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Updated SC2039 (markdown)
54
SC2039.md
54
SC2039.md
@@ -57,6 +57,60 @@ POSIX:
|
|||||||
while [ $((test)) -ne 0 ]; do foo; : $((next)); done
|
while [ $((test)) -ne 0 ]; do foo; : $((next)); done
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Arithmetic exponentiation
|
||||||
|
|
||||||
|
Bash:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
printf "%s\n" "$(( 2**63 ))"
|
||||||
|
```
|
||||||
|
|
||||||
|
POSIX:
|
||||||
|
|
||||||
|
The POSIX standard does not allow for exponents. However, you can replicate them completely built-in using a POSIX compatible function. As an example, the `pow` function from [here](http://unix.stackexchange.com/a/7925).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pow () {
|
||||||
|
set $1 $2 1
|
||||||
|
while [ $2 -gt 0 ]; do
|
||||||
|
set $1 $(($2-1)) $(($1*$3))
|
||||||
|
done
|
||||||
|
echo $3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To compare:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ echo "$(( 2**62 ))"
|
||||||
|
4611686018427387904
|
||||||
|
$ pow 2 62
|
||||||
|
4611686018427387904
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, if you don't mind using an external program, you can use `bc`. Be aware though: `bash` and other programs may abide by a certain maximum integer that `bc` does not (for `bash` that's: 64-bit signed long int, failing back to 32-bit signed long int).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
# Note the overflow that gives a negative number
|
||||||
|
$ echo "$(( 2**63 ))"
|
||||||
|
-9223372036854775808
|
||||||
|
|
||||||
|
# No such problem
|
||||||
|
$ echo 2^63 | bc
|
||||||
|
9223372036854775808
|
||||||
|
|
||||||
|
# 'bc' just keeps on going
|
||||||
|
$ echo 2^1280 | bc
|
||||||
|
20815864389328798163850480654728171077230524494533409610638224700807\
|
||||||
|
21611934672059602447888346464836968484322790856201558276713249664692\
|
||||||
|
98162798132113546415258482590187784406915463666993231671009459188410\
|
||||||
|
95379622423387354295096957733925002768876520583464697770622321657076\
|
||||||
|
83317005651120933244966378183760369413644440628104205339687097746591\
|
||||||
|
6057756101739472373801429441421111406337458176
|
||||||
|
```
|
||||||
|
|
||||||
### standalone `((..))`
|
### standalone `((..))`
|
||||||
|
|
||||||
Bash:
|
Bash:
|
||||||
|
Reference in New Issue
Block a user