263 lines
5.0 KiB
HTML
263 lines
5.0 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>Bash Variables Are Untyped</TITLE
|
|
><META
|
|
NAME="GENERATOR"
|
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
|
|
REL="HOME"
|
|
TITLE="Advanced Bash-Scripting Guide"
|
|
HREF="index.html"><LINK
|
|
REL="UP"
|
|
TITLE="Introduction to Variables and Parameters"
|
|
HREF="variables.html"><LINK
|
|
REL="PREVIOUS"
|
|
TITLE="Variable Assignment"
|
|
HREF="varassignment.html"><LINK
|
|
REL="NEXT"
|
|
TITLE="Special Variable Types"
|
|
HREF="othertypesv.html"></HEAD
|
|
><BODY
|
|
CLASS="SECT1"
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#840084"
|
|
ALINK="#0000FF"
|
|
><DIV
|
|
CLASS="NAVHEADER"
|
|
><TABLE
|
|
SUMMARY="Header navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TH
|
|
COLSPAN="3"
|
|
ALIGN="center"
|
|
>Advanced Bash-Scripting Guide: </TH
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="left"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="varassignment.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="80%"
|
|
ALIGN="center"
|
|
VALIGN="bottom"
|
|
>Chapter 4. Introduction to Variables and Parameters</TD
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="right"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="othertypesv.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><H1
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="UNTYPED"
|
|
></A
|
|
>4.3. Bash Variables Are Untyped</H1
|
|
><P
|
|
><A
|
|
NAME="BVUNTYPED"
|
|
></A
|
|
></P
|
|
><P
|
|
>Unlike many other programming languages, Bash does not segregate
|
|
its variables by <SPAN
|
|
CLASS="QUOTE"
|
|
>"type."</SPAN
|
|
> Essentially, <EM
|
|
>Bash
|
|
variables are character strings</EM
|
|
>, but, depending on
|
|
context, Bash permits arithmetic operations and comparisons on
|
|
variables. The determining factor is whether the value of a
|
|
variable contains only digits.</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="INTORSTRING"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 4-4. Integer or string?</B
|
|
></P
|
|
><TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#!/bin/bash
|
|
# int-or-string.sh
|
|
|
|
a=2334 # Integer.
|
|
let "a += 1"
|
|
echo "a = $a " # a = 2335
|
|
echo # Integer, still.
|
|
|
|
|
|
b=${a/23/BB} # Substitute "BB" for "23".
|
|
# This transforms $b into a string.
|
|
echo "b = $b" # b = BB35
|
|
declare -i b # Declaring it an integer doesn't help.
|
|
echo "b = $b" # b = BB35
|
|
|
|
let "b += 1" # BB35 + 1
|
|
echo "b = $b" # b = 1
|
|
echo # Bash sets the "integer value" of a string to 0.
|
|
|
|
c=BB34
|
|
echo "c = $c" # c = BB34
|
|
d=${c/BB/23} # Substitute "23" for "BB".
|
|
# This makes $d an integer.
|
|
echo "d = $d" # d = 2334
|
|
let "d += 1" # 2334 + 1
|
|
echo "d = $d" # d = 2335
|
|
echo
|
|
|
|
|
|
# What about null variables?
|
|
e='' # ... Or e="" ... Or e=
|
|
echo "e = $e" # e =
|
|
let "e += 1" # Arithmetic operations allowed on a null variable?
|
|
echo "e = $e" # e = 1
|
|
echo # Null variable transformed into an integer.
|
|
|
|
# What about undeclared variables?
|
|
echo "f = $f" # f =
|
|
let "f += 1" # Arithmetic operations allowed?
|
|
echo "f = $f" # f = 1
|
|
echo # Undeclared variable transformed into an integer.
|
|
#
|
|
# However ...
|
|
let "f /= $undecl_var" # 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 ...
|
|
let "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 $?</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
><P
|
|
>Untyped variables are both a blessing and a curse. They permit
|
|
more flexibility in scripting and make it easier to grind out
|
|
lines of code (and give you enough rope to hang yourself!).
|
|
However, they likewise permit subtle errors to creep in
|
|
and encourage sloppy programming habits.</P
|
|
><P
|
|
>To lighten the burden of keeping track of variable
|
|
types in a script, Bash <EM
|
|
>does</EM
|
|
> permit
|
|
<A
|
|
HREF="declareref.html"
|
|
>declaring</A
|
|
> variables.</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="NAVFOOTER"
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"><TABLE
|
|
SUMMARY="Footer navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="varassignment.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="index.html"
|
|
ACCESSKEY="H"
|
|
>Home</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="othertypesv.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
>Variable Assignment</TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="variables.html"
|
|
ACCESSKEY="U"
|
|
>Up</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>Special Variable Types</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |