rable 0.2.0

A Rust implementation of the Parable bash parser — complete GNU Bash 5.3-compatible parsing with Python bindings
Documentation
# Iteration 27: Deprecated arithmetic ($[expr])

# === Basic deprecated arithmetic ===

=== simple addition
echo $[1+2]
---
(command (word "echo") (word "$[1+2]"))
---


=== simple subtraction
echo $[5-3]
---
(command (word "echo") (word "$[5-3]"))
---


=== multiplication
echo $[4*5]
---
(command (word "echo") (word "$[4*5]"))
---


=== division
echo $[10/2]
---
(command (word "echo") (word "$[10/2]"))
---


=== modulo
echo $[10%3]
---
(command (word "echo") (word "$[10%3]"))
---


=== spaces around operators
echo $[ 1 + 2 ]
---
(command (word "echo") (word "$[ 1 + 2 ]"))
---


=== leading space
echo $[ 42]
---
(command (word "echo") (word "$[ 42]"))
---


=== trailing space
echo $[42 ]
---
(command (word "echo") (word "$[42 ]"))
---


=== variable reference
echo $[$x]
---
(command (word "echo") (word "$[$x]"))
---


=== variable in expression
echo $[x+1]
---
(command (word "echo") (word "$[x+1]"))
---


=== multiple variables
echo $[a+b]
---
(command (word "echo") (word "$[a+b]"))
---


=== parenthesized expression
echo $[(1+2)*3]
---
(command (word "echo") (word "$[(1+2)*3]"))
---


=== nested parentheses
echo $[((a+b)*c)]
---
(command (word "echo") (word "$[((a+b)*c)]"))
---


=== comparison
echo $[a>b]
---
(command (word "echo") (word "$[a>b]"))
---


=== ternary
echo $[a?b:c]
---
(command (word "echo") (word "$[a?b:c]"))
---


=== in assignment
x=$[1+2]
---
(command (word "x=$[1+2]"))
---


=== in double quotes
echo "$[1+2]"
---
(command (word "echo") (word "\"$[1+2]\""))
---


=== concatenated with text
echo "result: $[1+2]"
---
(command (word "echo") (word "\"result: $[1+2]\""))
---


=== multiple in one word
echo $[1+2]$[3+4]
---
(command (word "echo") (word "$[1+2]$[3+4]"))
---


=== mixed with modern arithmetic
echo $[1+2] $((3+4))
---
(command (word "echo") (word "$[1+2]") (word "$((3+4))"))
---


=== in redirect target
cat > $[fd]
---
(command (word "cat") (redirect ">" "$[fd]"))
---


=== nested brackets
echo $[[1+2]*3]
---
(command (word "echo") (word "$[[1+2]*3]"))
---


=== empty expression
echo $[]
---
(command (word "echo") (word "$[]"))
---


=== just a number
echo $[42]
---
(command (word "echo") (word "$[42]"))
---


=== bitwise and
echo $[a&b]
---
(command (word "echo") (word "$[a&b]"))
---


=== bitwise or
echo $[a|b]
---
(command (word "echo") (word "$[a|b]"))
---


=== bitwise xor
echo $[a^b]
---
(command (word "echo") (word "$[a^b]"))
---


=== bitwise not
echo $[~a]
---
(command (word "echo") (word "$[~a]"))
---


=== left shift
echo $[a<<2]
---
(command (word "echo") (word "$[a<<2]"))
---


=== right shift
echo $[a>>2]
---
(command (word "echo") (word "$[a>>2]"))
---


=== logical and
echo $[a&&b]
---
(command (word "echo") (word "$[a&&b]"))
---


=== logical or
echo $[a||b]
---
(command (word "echo") (word "$[a||b]"))
---


=== in pipeline
echo $[1+2] | cat
---
(pipe (command (word "echo") (word "$[1+2]")) (command (word "cat")))
---


=== in function body
f() { echo $[x+1]; }
---
(function "f" (brace-group (command (word "echo") (word "$[x+1]"))))
---


=== in if condition
if [ $[x] -eq 1 ]; then echo yes; fi
---
(if (command (word "[") (word "$[x]") (word "-eq") (word "1") (word "]")) (command (word "echo") (word "yes")))
---


=== in for loop
for i in $[1] $[2] $[3]; do echo $i; done
---
(for (word "i") (in (word "$[1]") (word "$[2]") (word "$[3]")) (command (word "echo") (word "$i")))
---


=== in while condition
while [ $[x] -lt 10 ]; do x=$[x+1]; done
---
(while (command (word "[") (word "$[x]") (word "-lt") (word "10") (word "]")) (command (word "x=$[x+1]")))
---


=== in case word
case $[x] in 1) echo one;; esac
---
(case (word "$[x]") (pattern ((word "1")) (command (word "echo") (word "one"))))
---


=== deprecated in here string
cat <<< $[1+2]
---
(command (word "cat") (redirect "<<<" "$[1+2]"))
---


=== deprecated in array index
echo ${arr[$[i+1]]}
---
(command (word "echo") (word "${arr[$[i+1]]}"))
---


=== prefix and suffix text
echo prefix$[1+2]suffix
---
(command (word "echo") (word "prefix$[1+2]suffix"))
---


=== in subshell
(echo $[1+2])
---
(subshell (command (word "echo") (word "$[1+2]")))
---


=== in brace group
{ echo $[1+2]; }
---
(brace-group (command (word "echo") (word "$[1+2]")))
---


=== complex nested expression
echo $[((a+b)*(c-d))/e]
---
(command (word "echo") (word "$[((a+b)*(c-d))/e]"))
---


=== assignment operators
x=$[y+=1]
---
(command (word "x=$[y+=1]"))
---


=== comma operator
echo $[a=1,b=2,a+b]
---
(command (word "echo") (word "$[a=1,b=2,a+b]"))
---