Shell变量无严格类型,所有变量默认为字符串;数字转字符串自动发生,字符串转数值需进入算术上下文(如$((...))、let、expr),浮点数用bc或awk,安全转换需正则校验,前导零默认八进制,日期与时间戳互转用date命令。

Shell本身没有严格的数据类型概念,所有变量默认都是字符串。所谓“转换”,其实是通过特定语法或命令触发数值解析或字符串化行为。关键不在于类型声明,而在于你用什么上下文去读取它。
数字转字符串:多数情况无需显式操作
Shell在输出、拼接、赋值等场景中会自动把数字当字符串处理。比如:
-
num=42; echo "value: $num"——$num被直接展开为字符串"42" -
str="$num"或str=$num""—— 加空字符串可强化字符串语义,避免后续被误作数值 - 浮点数同样适用:
val=$(awk 'BEGIN{print 3.14*2}'); echo "pi×2 = $val",$val就是字符串"6.28"
字符串转数值:核心是进入算术上下文
只要让Shell把变量当作数字参与运算,它就会尝试解析。常用方式有:
-
$((...)):最推荐。支持进制前缀(如0x1F、8#17、2#1010)和基本运算。str="012"; num=$((str))→num=10(八进制解析) -
let:适合赋值计算。str="100"; let val=str+5→val=105;注意变量名不加$ -
expr:较老但兼容性好。str="20"; num=$(expr $str + 0)→ 强制转整数 -
bc或awk:处理浮点数或复杂表达式。str="3.14"; num=$(echo "$str * 2" | bc -l)
安全转换:先校验再解析
非法字符串(如 "abc" 或 "12a")直接用于算术会导致错误或静默截断。建议配合正则检查:
- 整数校验:
[[ $str =~ ^-?[0-9]+$ ]] && num=$((str)) || echo "not an integer" - 带小数点的数字:
[[ $str =~ ^-?[0-9]+\.?[0-9]*$ ]] && num=$(awk 'BEGIN{print '"$str"'}') - 前导零问题:字符串
"010"用$((...))默认按八进制解析得8;如需十进制,写成$((10#$str))
日期与数字互转:靠 date 命令完成
时间戳与格式化字符串之间的转换不属于变量类型转换,而是标准工具链:
- 日期串 → 秒级时间戳:
ts=$(date -d "2026-06-18" +%s) - 时间戳 → 日期串:
date -d "@$ts" "+%Y-%m-%d %H:%M" - 注意:
date -d支持多种输入格式(如"last Monday"、"2 days ago"),比纯字符串解析更健壮

















