数据类型

严格来说,Shell 只有一种数据类型:字符串。但 Shell 提供了一些机制,让字符串可以当数字用,也可以当数组用。

字符串

字符串是 Shell 的基本数据类型,有两种定义方式:

单引号字符串

STR='Hello World'

单引号的特点:

  • 原样输出,变量和转义字符不解析
  • 不能包含单引号
NAME="张三"
echo '你好,$NAME'    # 输出:你好,$NAME
echo '换行\n测试'     # 输出:换行\n测试

双引号字符串

STR="Hello World"

双引号的特点:

  • 解析变量和转义字符
  • 可以包含单引号
NAME="张三"
echo "你好,$NAME"    # 输出:你好,张三
echo "换行\n测试"     # 输出两行
echo "他说:'你好'"   # 输出:他说:'你好'

什么时候用单引号,什么时候用双引号

  • 字符串里有变量或转义字符,用双引号
  • 纯文本,用单引号(性能略好)
  • 不确定时,用双引号更安全

数字

Shell 没有真正的数字类型,但可以做数学运算:

# 方式一:$(( ))
A=10
B=20
SUM=$((A + B))
echo $SUM   # 30

# 方式二:let
let SUM=A+B
echo $SUM

# 方式三:expr
SUM=$(expr $A + $B)
echo $SUM

# 方式四:bc(支持小数)
PI=$(echo "scale=2; 22/7" | bc)
echo $PI   # 3.14

$(( )) 是最推荐的方式,简洁高效。

自增自减

COUNT=0
COUNT=$((COUNT + 1))
((COUNT++))    # 自增
((COUNT--))    # 自减

数组

Shell 支持一维数组,Bash 4.0 以上支持关联数组。

普通数组

# 定义数组
ARR=(one two three four)

# 或逐个赋值
ARR[0]=one
ARR[1]=two
ARR[2]=three

# 访问元素
echo ${ARR[0]}    # one
echo ${ARR[@]}    # 所有元素
echo ${#ARR[@]}   # 数组长度

关联数组

# 声明关联数组
declare -A USER

USER[name]="张三"
USER[age]=25
USER[city]="北京"

echo ${USER[name]}    # 张三
echo ${USER[@]}       # 所有值
echo ${!USER[@]}      # 所有键

布尔值

Shell 没有真正的布尔类型,用整数表示:

  • 0 表示 true(成功)
  • 非 0 表示 false(失败)
if [ 1 ]; then
    echo "true"
fi

# 实际上 [ 1 ] 返回 0,所以执行

在条件判断中:

TRUE=1
FALSE=0

if [ $TRUE ]; then
    echo "真"
fi

类型转换

Shell 不需要显式类型转换,但有些场景要注意:

字符串转数字

NUM="123"
echo $((NUM + 1))   # 124,自动转换

数字转字符串

NUM=123
STR="数字是 $NUM"
echo $STR   # 数字是 123

类型判断

判断变量是否为数字:

is_number() {
    [[ $1 =~ ^[0-9]+$ ]]
}

if is_number "123"; then
    echo "是数字"
fi

判断变量是否为空:

if [ -z "$VAR" ]; then
    echo "变量为空"
fi

if [ -n "$VAR" ]; then
    echo "变量非空"
fi

小结

Shell 数据类型要点:

  1. 本质都是字符串
  2. 数学运算用 $(( ))
  3. 数组用括号定义
  4. 关联数组需要 declare -A
  5. 布尔值用 0 和非 0 表示