严格来说,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 没有真正的布尔类型,用整数表示:
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 数据类型要点:
$(( ))declare -A