#! /usr/bin/env python
from stat import *
#!/bin/bash
# int-or-string.sh
a=2334                   # Integer.
# int-or-string.sh
a=2334
let "a += 1"
# Integer.
"a +"= 1
echo "a = $a "           # a = 2335
print("a = " + str(a) + " ")
echo                     # Integer, still.
# a = 2335
print()
b=${a/23/BB}             # Substitute "BB" for "23".
# Integer, still.
b=a/23/BB
                         # This transforms $b into a string.
echo "b = $b"            # b = BB35
# Substitute "BB" for "23".
# This transforms $b into a string.
print("b = " + str(b))
declare -i b             # Declaring it an integer doesn't help.
# b = BB35
b=""
echo "b = $b"            # b = BB35
# Declaring it an integer doesn't help.
print("b = " + str(b))
let "b += 1"             # BB35 + 1
# b = BB35
"b +"= 1
echo "b = $b"            # b = 1
# BB35 + 1
print("b = " + str(b))
echo                     # Bash sets the "integer value" of a string to 0.
# b = 1
print()
c=BB34
# Bash sets the "integer value" of a string to 0.
c="BB34"
echo "c = $c"            # c = BB34
print("c = " + str(c))
d=${c/BB/23}             # Substitute "23" for "BB".
# c = BB34
d=c/BB/23
                         # This makes $d an integer.
echo "d = $d"            # d = 2334
# Substitute "23" for "BB".
# This makes $d an integer.
print("d = " + str(d))
let "d += 1"             # 2334 + 1
# d = 2334
"d +"= 1
echo "d = $d"            # d = 2335
# 2334 + 1
print("d = " + str(d))
echo
# d = 2335
print()
# What about null variables?
e=''                     # ... Or e="" ... Or e=
# What about null variables?
e=""
echo "e = $e"            # e =
# ... Or e="" ... Or e=
print("e = " + str(e))
let "e += 1"             # Arithmetic operations allowed on a null variable?
# e =
"e +"= 1
echo "e = $e"            # e = 1
# Arithmetic operations allowed on a null variable?
print("e = " + str(e))
echo                     # Null variable transformed into an integer.
# e = 1
print()
# What about undeclared variables?
echo "f = $f"            # f =
# Null variable transformed into an integer.
# What about undeclared variables?
print("f = " + str(f))
let "f += 1"             # Arithmetic operations allowed?
# f =
"f +"= 1
echo "f = $f"            # f = 1
# Arithmetic operations allowed?
print("f = " + str(f))
echo                     # Undeclared variable transformed into an integer.
# f = 1
print()
#
# However ...
let "f /= $undecl_var"   # Divide by zero?
# Undeclared variable transformed into an integer.
#
# However ...
"f /"= undecl_var
#   let: f /= : syntax error: operand expected (error token is " ")
# Syntax error! Variable $undecl_var is not set to zero here!
#
# But still ...
let "f /= 0"
# Divide by zero?
#   let: f /= : syntax error: operand expected (error token is " ")
# Syntax error! Variable $undecl_var is not set to zero here!
#
# But still ...
"f /"= 0
#   let: f /= 0: division by 0 (error token is "0")
# Expected behavior.
#  Bash (usually) sets the "integer value" of null to zero
#+ when performing an arithmetic operation.
#  But, don't try this at home, folks!
#  It's undocumented and probably non-portable behavior.
# Conclusion: Variables in Bash are untyped,
#+ with all attendant consequences.
exit $?
#   let: f /= 0: division by 0 (error token is "0")
# Expected behavior.
#  Bash (usually) sets the "integer value" of null to zero
#+ when performing an arithmetic operation.
#  But, don't try this at home, folks!
#  It's undocumented and probably non-portable behavior.
# Conclusion: Variables in Bash are untyped,
#+ with all attendant consequences.
exit(_rc)
ÿ