📝 Shell变量常用命令大全
一、变量操作核心命令
| 命令 | 语法 | 作用 | 示例 | 说明 |
|---|
| 赋值 | 变量=值 | 创建/修改变量 | name="John" | 等号两边不能有空格 |
| 引用 | $变量 | 获取变量值 | echo $name | 简单引用 |
| 引用 | ${变量} | 安全引用 | echo ${name} | 推荐,可边界识别 |
| 显示 | echo $变量 | 输出变量 | echo $HOME | 显示变量内容 |
| 显示 | printf | 格式化输出 | printf "%s\n" $name | 更强大 |
| 删除 | unset 变量 | 删除变量 | unset name | 变量消失 |
| 只读 | readonly 变量 | 设为只读 | readonly PI=3.14 | 不能修改 |
二、变量类型声明
| 命令 | 选项 | 作用 | 示例 | 说明 |
|---|
| declare | -i | 整数变量 | declare -i num=10 | 只能存整数 |
| -r | 只读变量 | declare -r version="1.0" | 不能修改 |
| -l | 自动小写 | declare -l lower="HELLO" | 值转小写 |
| -u | 自动大写 | declare -u upper="world" | 值转大写 |
| -a | 数组变量 | declare -a arr=(1 2 3) | 索引数组 |
| -A | 关联数组 | declare -A map=([k]=v) | 键值对 |
| -x | 环境变量 | declare -x PATH | 同export |
| -p | 显示属性 | declare -p name | 显示变量详情 |
| typeset | 同上 | 同declare | typeset -i num=5 | 兼容ksh |
| local | | 函数局部 | local temp="test" | 只能在函数内 |
| export | | 环境变量 | export PATH=$PATH:/usr | 子进程继承 |
| readonly | | 只读 | readonly DEBUG=true | 同declare -r |
三、变量查看命令
| 命令 | 作用 | 示例 | 说明 |
|---|
| set | 显示所有变量 | set | grep USER | 显示所有变量和函数 |
| env | 显示环境变量 | env | grep PATH | 只显示环境变量 |
| printenv | 显示环境变量 | printenv HOME | 可指定变量 |
| declare | 显示所有变量 | declare -p | 显示变量和属性 |
| typeset | 同declare | typeset -p | 同上 |
| compgen -v | 列出变量名 | compgen -v | 只显示名字 |
| echo | 显示单个 | echo $PWD | 最常用 |
四、变量测试判断
| 语法 | 作用 | 示例 | 说明 |
|---|
| test -z | 是否为空 | test -z "$var" | 空返回真 |
| test -n | 是否非空 | test -n "$var" | 非空返回真 |
| [ -z ] | test别名 | [ -z "$var" ] | 需空格 |
| [[ -z ]] | 增强测试 | [[ -z $var ]] | 可不用引号 |
| ${var:-def} | 默认值 | echo ${name:-匿名} | 空则用默认 |
| ${var:=def} | 赋值默认 | : ${age:=18} | 空则赋值 |
| ${var:?err} | 检查存在 | : ${JAVA_HOME:?} | 未定义报错 |
| ${var:+val} | 存在替换 | echo ${name:+有值} | 存在则替换 |
五、字符串操作
| 语法 | 作用 | 示例 | 结果 |
|---|
| ${#var} | 字符串长度 | name="Tom"; echo ${#name} | 3 |
| ${var:start} | 从start截取 | str="Hello"; echo ${str:2} | llo |
| ${var:start:len} | 截取指定长度 | str="Hello"; echo ${str:1:3} | ell |
| ${var#pattern} | 删最短前缀 | file="a.b.c"; echo ${file#*.} | b.c |
| ${var##pattern} | 删最长前缀 | file="a.b.c"; echo ${file##*.} | c |
| ${var%pattern} | 删最短后缀 | file="a.b.c"; echo ${file%.*} | a.b |
| ${var%%pattern} | 删最长后缀 | file="a.b.c"; echo ${file%%.*} | a |
| ${var/old/new} | 替换第一个 | str="a b a"; echo ${str/a/x} | x b a |
| ${var//old/new} | 替换全部 | str="a b a"; echo ${str//a/x} | x b x |
| ${var/#old/new} | 开头替换 | str="abc"; echo ${str/#a/x} | xbc |
| ${var/%old/new} | 结尾替换 | str="abc"; echo ${str/%c/x} | abx |
| ${var^^} | 转大写 | str="hello"; echo ${str^^} | HELLO |
| ${var,,} | 转小写 | str="HELLO"; echo ${str,,} | hello |
| ${var^} | 首字母大写 | str="hello"; echo ${var^} | Hello |
| ${var,} | 首字母小写 | str="HELLO"; echo ${var,} | hELLO |
六、算术运算
| 语法 | 作用 | 示例 | 结果 |
|---|
| $(( )) | 整数运算 | echo $((5+3)) | 8 |
| let | 算术运算 | let a=5+3; echo $a | 8 |
| expr | 表达式计算 | expr 5 + 3 | 8 |
| bc | 浮点运算 | echo "5.5+3.2" | bc | 8.7 |
七、数组操作
| 语法 | 作用 | 示例 | 说明 |
|---|
| arr=(v1 v2) | 创建数组 | fruits=(apple orange) | 空格分隔 |
| ${arr[0]} | 取元素 | echo ${fruits[0]} | 下标从0开始 |
| ${arr[@]} | 取所有 | echo ${fruits[@]} | 所有元素 |
| ${#arr[@]} | 数组长度 | echo ${#fruits[@]} | 元素个数 |
| ${!arr[@]} | 所有下标 | echo ${!fruits[@]} | 索引列表 |
| unset arr[0] | 删除元素 | unset fruits[0] | 删除指定 |
| unset arr | 删除数组 | unset fruits | 整个删除 |
| arr+=(v3) | 追加元素 | fruits+=("grape") | 末尾添加 |
八、位置参数
| 语法 | 作用 | 示例 | 说明 |
|---|
| $0 | 脚本名 | echo $0 | 当前脚本 |
| $1-$9 | 第1-9个参数 | echo $1 $2 | 位置参数 |
| ${10} | 第10个参数 | echo ${10} | 10以上要{} |
| $# | 参数个数 | echo $# | 参数总数 |
| $@ | 所有参数 | for i in "$@"; do | 每个作为独立词 |
| $* | 所有参数 | for i in "$*"; do | 整体一个字符串 |
| shift | 参数左移 | shift 2 | 丢弃前2个参数 |
九、特殊变量
| 变量 | 作用 | 示例 | 说明 |
|---|
| $$ | 当前PID | echo $$ | 脚本进程ID |
| $? | 退出码 | echo $? | 上命令执行结果 |
| $! | 后台PID | echo $! | 最后后台进程 |
| $_ | 上命令最后参数 | echo $_ | 快捷使用 |
| $- | 当前选项 | echo $- | Shell选项 |
| $IFS | 分隔符 | echo "$IFS" | 默认空格/Tab/换行 |
十、实用组合
# 1. 变量存在检查
[ -z "$JAVA_HOME" ] && echo "JAVA_HOME未设置"
# 2. 默认值赋值
: ${PORT:=8080}
# 3. 变量导出
export PATH="$PATH:/usr/local/bin"
# 4. 只读常量
readonly MAX_CONNECTIONS=1000
# 5. 临时变量(命令执行前)
DEBUG=true ./script.sh
# 6. 变量间接引用
var_name="HOME"
echo ${!var_name} # 输出家目录
# 7. 命令结果赋值
files=$(ls -la)
# 8. 多变量赋值
read a b c <<< "1 2 3"
✅ 核心记忆
| 类别 | 最常用命令 |
|---|
| 赋值 | var=value |
| 引用 | $var ${var} |
| 显示 | echo $var |
| 删除 | unset var |
| 只读 | readonly var |
| 环境 | export var |
| 局部 | local var |
| 测试 | [ -z "$var" ] |
| 默认 | ${var:-default} |
| 长度 | ${#var} |
| 切片 | ${var:0:5} |
| 替换 | ${var/old/new} |
发表回复