Appearance
变量
变量定义
基本语法
bash
# 定义变量
变量名=值
# 注意:等号两边不能有空格
name="张三"
age=25
is_student=true命名规则
bash
# 有效的变量名
name
user_name
USER_NAME
_name2
# 无效的变量名
2name # 不能以数字开头
user-name # 不能使用连字符
user name # 不能包含空格
@name # 不能使用特殊字符命名约定
bash
# 全大写:环境变量
PATH
HOME
USER
# 小写:局部变量
name
age
count
# 下划线分隔:多词变量
user_name
file_path变量使用
引用变量
bash
# 定义变量
name="张三"
# 使用变量
echo $name
echo ${name}
# 区分变量名
echo "${name}你好" # 输出:张三你好
echo "$name你好" # 输出:张三你好变量赋值
bash
# 直接赋值
name="张三"
age=25
# 命令结果赋值
current_dir=$(pwd)
current_date=$(date +%Y-%m-%d)
# 命令替换(旧方式)
current_dir=`pwd`
# 算术运算
count=10
count=$((count + 1))变量类型
字符串变量
bash
# 单引号:原样输出
message='Hello $name' # 输出:Hello $name
# 双引号:解析变量
name="张三"
message="Hello $name" # 输出:Hello 张三
# 不加引号:解析变量和通配符
message=Hello$name # 输出:Hello张三数字变量
bash
# 整数
count=10
total=100
# 算术运算
result=$((count + total))
result=$((count * 2))
result=$((count / 2))
result=$((count % 3))布尔变量
bash
# Bash 没有真正的布尔类型
# 使用字符串表示
is_true=true
is_false=false
# 使用数字表示
is_enabled=1
is_disabled=0
# 判断
if [ "$is_true" = "true" ]; then
echo "启用"
fi只读变量
定义只读变量
bash
# 定义只读变量
readonly PI=3.14159
readonly MAX_SIZE=100
# 或使用 declare
declare -r PI=3.14159
# 尝试修改会报错
PI=3.14 # 报错:PI: readonly variable使用场景
bash
# 常量定义
readonly CONFIG_FILE="/etc/config.conf"
readonly LOG_DIR="/var/log"
readonly MAX_RETRIES=3删除变量
使用 unset
bash
# 定义变量
name="张三"
# 删除变量
unset name
# 使用变量会得到空值
echo $name # 输出空行注意事项
bash
# 只读变量不能删除
readonly PI=3.14
unset PI # 报错:unset: PI: cannot unset: readonly variable环境变量
查看环境变量
bash
# 查看所有环境变量
env
printenv
# 查看特定变量
echo $PATH
echo $HOME
echo $USER设置环境变量
bash
# 临时设置(当前会话有效)
export PATH="/usr/local/bin:$PATH"
export EDITOR=vim
# 永久设置(添加到配置文件)
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc常用环境变量
bash
# 用户信息
echo $USER # 当前用户名
echo $HOME # 用户主目录
echo $SHELL # 当前 Shell
# 系统信息
echo $PATH # 命令搜索路径
echo $PWD # 当前工作目录
echo $HOSTNAME # 主机名
# 其他
echo $LANG # 语言设置
echo $TERM # 终端类型
echo $UID # 用户 ID特殊变量
位置参数
bash
#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "第三个参数: $3"
echo "所有参数: $@"
echo "参数个数: $#"其他特殊变量
bash
#!/bin/bash
# 上一条命令的退出状态
echo "退出状态: $?"
# 当前 Shell 的进程 ID
echo "进程 ID: $$"
# 后台运行的最后一个进程的进程 ID
echo "后台进程 ID: $!"
# 选项参数
echo "选项参数: $-"
# 上一个命令的最后一个参数
echo "上一个参数: $_"变量操作
字符串长度
bash
name="张三"
# 获取字符串长度
echo ${#name} # 输出:2
# 获取数组长度
arr=(a b c)
echo ${#arr[@]} # 输出:3子字符串提取
bash
name="Hello World"
# 从位置 0 开始,提取 5 个字符
echo ${name:0:5} # 输出:Hello
# 从位置 6 开始到结尾
echo ${name:6} # 输出:World
# 提取最后 3 个字符
echo ${name: -3} # 输出:rld字符串替换
bash
name="Hello World"
# 替换第一个匹配
echo ${name/World/Bash} # 输出:Hello Bash
# 替换所有匹配
echo ${name//l/L} # 输出:HeLLo WorLd
# 删除匹配
echo ${name/World/} # 输出:Hello默认值
bash
# 如果变量未设置或为空,使用默认值
echo ${name:-"默认值"}
# 如果变量未设置,使用默认值
echo ${name:="默认值"}
# 如果变量已设置,使用默认值
echo ${name:+"默认值"}
# 如果变量未设置或为空,报错
echo ${name:?"变量未设置"}变量作用域
局部变量
bash
#!/bin/bash
func() {
local local_var="局部变量"
echo "函数内: $local_var"
}
func
echo "函数外: $local_var" # 输出空行全局变量
bash
#!/bin/bash
global_var="全局变量"
func() {
echo "函数内: $global_var"
global_var="修改后的全局变量"
}
func
echo "函数外: $global_var" # 输出:修改后的全局变量变量检查
检查变量是否设置
bash
# 检查变量是否设置
if [ -z "$name" ]; then
echo "变量未设置或为空"
fi
if [ -n "$name" ]; then
echo "变量已设置且不为空"
fi检查变量类型
bash
# 检查是否为数字
if [[ "$age" =~ ^[0-9]+$ ]]; then
echo "是数字"
fi
# 检查是否为整数
if [[ "$age" =~ ^-?[0-9]+$ ]]; then
echo "是整数"
fi实用示例
示例1:用户输入
bash
#!/bin/bash
echo "请输入你的名字:"
read name
echo "请输入你的年龄:"
read age
echo "你好,$name!"
echo "你今年 $age 岁。"示例2:配置文件
bash
#!/bin/bash
# 配置变量
CONFIG_FILE="/etc/config.conf"
LOG_DIR="/var/log/myapp"
MAX_SIZE=100
# 使用变量
echo "配置文件: $CONFIG_FILE"
echo "日志目录: $LOG_DIR"
echo "最大大小: $MAX_SIZE"示例3:计数器
bash
#!/bin/bash
count=0
while [ $count -lt 5 ]; do
echo "计数: $count"
count=$((count + 1))
done
echo "最终计数: $count"最佳实践
1. 使用引号
bash
# 好的做法
echo "$name"
echo "${name}你好"
# 不好的做法
echo $name
echo $name你好2. 使用花括号
bash
# 好的做法
echo "${name}你好"
echo "${file_path}/file.txt"
# 不好的做法
echo $name你好
echo $file_path/file.txt3. 检查变量
bash
# 好的做法
if [ -n "$name" ]; then
echo "$name"
fi
# 不好的做法
echo $name总结
Shell 变量的关键点:
- 定义变量:
变量名=值(注意等号两边无空格) - 引用变量:
$变量名或${变量名} - 只读变量:
readonly或declare -r - 删除变量:
unset 变量名 - 环境变量:使用
export导出 - 局部变量:在函数中使用
local
下一节我们将学习字符串的操作。