Shell脚本变量用法详解

以下是一个Shell脚本示例,展示变量的基本用法、特殊变量和常见操作:

#!/bin/bash

# 基本变量定义与使用
name="Shell Script"
version=1.0
echo "当前运行: $name 版本 $version"

# 只读变量
readonly const_value="constant"
echo "常量值: $const_value"

# 删除变量
temp_var="temporary"
unset temp_var
echo "已删除变量: ${temp_var:-未定义}"

# 特殊变量
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "参数总数: $#"
echo "所有参数: $@"
echo "退出状态: $?"
echo "当前进程ID: $$"

# 变量替换
default_value="default"
echo "使用默认值: ${undefined_var:-$default_value}"

# 命令替换
current_date=`date +%Y-%m-%d`
echo "当前日期: $current_date"

# 算术运算
num1=10
num2=3
result=$((num1 + num2))
echo "计算结果: $result"

# 数组变量
colors=("red" "green" "blue")
echo "第一个颜色: ${colors[0]}"
echo "所有颜色: ${colors[@]}"

# 环境变量
echo "当前用户: $USER"
echo "家目录: $HOME"
echo "路径: $PATH"

# 字符串操作
str="hello world"
echo "字符串长度: ${#str}"
echo "子字符串: ${str:0:5}"
echo "替换: ${str/world/shell}"

# 输入变量
read -p "请输入您的名字: " user_name
echo "欢迎, $user_name"

变量类型说明

  • 局部变量:仅在当前Shell实例中有效
  • 环境变量:所有子进程均可访问的变量
  • Shell变量:由Shell设置的特殊变量

变量命名规则

  1. 名称只能包含字母、数字和下划线
  2. 不能以数字开头
  3. 避免使用Shell关键字
  4. 习惯上使用大写字母表示常量

注意事项

  • 等号两边不能有空格
  • 字符串值建议使用双引号
  • 单引号会禁用变量替换
  • 使用${var}形式避免歧义
  • 未定义的变量扩展为空值

Shell 脚本变量基础

  • 变量的定义与赋值
  • 变量命名规则(大小写敏感、禁止数字开头等)
  • 变量的引用方式($var${var}

变量类型与作用域

  • 局部变量(函数内生效)
  • 环境变量(全局生效,export 用法)
  • 特殊变量($0$#$* 等)

字符串变量操作

  • 字符串拼接(直接连接或双引号嵌套)
  • 字符串长度获取(${#var}
  • 子字符串截取(${var:start:length}
  • 字符串替换(${var/old/new} 和全局替换 ${var//old/new}

数值变量运算

  • 整数运算($(( ))let 命令)
  • 浮点数运算(借助 bcawk
  • 自增/自减操作(((var++))

数组变量用法

  • 数组定义与初始化(arr=(val1 val2)
  • 数组元素访问(${arr[index]}
  • 数组遍历(for 循环结合 ${arr[@]}
  • 关联数组(declare -A 声明)

变量高级技巧

  • 变量默认值设置(${var:-default}
  • 只读变量(readonly 声明)
  • 变量间接引用(eval! 符号)
  • 变量类型检查(declare -p

实际应用案例

  • 脚本参数处理($1$2 结合 shift
  • 配置文件读取(变量动态加载)
  • 日志输出中的变量格式化

注意事项与调试

  • 变量未定义的常见错误
  • 引号的使用场景(防止空格分割)
  • 调试技巧(set -x 跟踪变量展开)

该大纲覆盖基础到进阶的变量用法,适合作为技术文章或教程的框架。

Shell脚本变量基础

Shell脚本中的变量用于存储数据,无需声明类型,直接赋值即可。变量名区分大小写,通常使用大写字母表示常量,小写字母表示普通变量。

定义与赋值

name="John"  # 字符串赋值
count=10     # 整数赋值

引用变量
使用 $ 符号或 ${} 引用变量:

echo $name
echo ${count}

变量类型与作用域

局部变量
默认情况下,变量仅在当前脚本中有效:

local_var="value"  # 仅在当前脚本或函数内可见

环境变量
通过 export 使变量对子进程可见:

export PATH=$PATH:/usr/local/bin

特殊变量

  • $0:脚本名称
  • $1~$9:脚本参数
  • $#:参数个数
  • $?:上一条命令的退出状态

字符串操作

拼接字符串

greeting="Hello, "$name"!"

获取字符串长度

length=${#name}

截取子串

substr=${name:1:3}  # 从第2个字符开始截取3个字符

数组变量

定义数组

fruits=("apple" "banana" "orange")

访问数组元素

echo ${fruits[0]}    # 输出第一个元素
echo ${fruits[@]}    # 输出所有元素
echo ${#fruits[@]}   # 输出数组长度

变量替换与默认值

默认值替换

${var:-default}  # 若var未定义,使用default
${var:=default}  # 若var未定义,赋值default并返回

错误检查

${var:?error_msg}  # 若var未定义,输出错误并退出

实际应用示例

读取用户输入

read -p "Enter your name: " username
echo "Welcome, $username!"

数学运算

sum=$((a + b))  # 使用 $(( )) 进行算术运算

参考资源推荐

  1. 《Linux命令行与Shell脚本编程大全》 - 中文经典教材,涵盖Shell变量详解。
  2. 《Shell脚本学习指南》 - 针对变量操作和高级用法有详细案例。
  3. GNU Bash官方手册(中文翻译版) - 提供完整的变量语法规范。

以上内容可通过图书馆或在线技术社区(如CSDN、掘金)获取电子版或章节试读。

变量定义与赋值

在 Shell 脚本中,变量无需声明类型,直接通过赋值定义。变量名区分大小写,通常使用大写字母作为命名约定(非强制)。赋值时等号(=)两侧不能有空格。

VAR_NAME="value"  # 定义字符串变量
NUM=123          # 定义数值变量

变量引用

使用 $ 符号或 ${} 引用变量。${} 可避免变量名与后续字符混淆,推荐使用。

echo $VAR_NAME    # 输出变量值
echo ${VAR_NAME}_suffix  # 明确变量边界

变量类型与默认值

Shell 变量默认为字符串类型,即使赋值为数字。可通过以下方式设置默认值或检测未定义变量:

${VAR:-default}    # 若VAR未定义或为空,返回default
${VAR:=default}    # 若VAR未定义或为空,赋值为default并返回
${VAR:?error_msg}  # 若VAR未定义或为空,输出错误并终止脚本

环境变量与局部变量

  • 环境变量:通过 export 导出,子进程可继承。
    export PATH=$PATH:/new_path  # 导出为环境变量
    

  • 局部变量:仅在当前脚本或函数中生效。

特殊变量

Shell 提供内置特殊变量,用于脚本操作:

  • $0:脚本名称
  • $1~$9:脚本参数
  • $#:参数个数
  • $@:所有参数(列表形式)
  • $?:上一条命令的退出状态码

数组变量

Shell 支持一维数组,下标从0开始:

ARR=("a" "b" "c")  # 定义数组
echo ${ARR[1]}     # 输出第二个元素(b)
echo ${ARR[@]}     # 输出所有元素

只读变量

通过 readonly 声明不可修改的变量:

readonly CONST="immutable"

变量作用域

函数内定义的变量默认为全局变量。使用 local 关键字限定为局部变量:

func() {
  local LOCAL_VAR="local"
}

字符串操作

  • 获取长度:${#VAR}
  • 子字符串:${VAR:start:length}
  • 替换:${VAR/old/new}(仅替换第一个匹配)

数值运算

需用 $(( ))let 进行算术运算:

SUM=$((1 + 2))      # 输出3
let "SUM = 1 + 2"   # 等效写法

Shell 变量基础

Shell 变量用于存储数据,无需声明类型,直接赋值即可使用。变量名通常大写(约定俗成),但区分大小写。

定义变量(无空格):

VAR_NAME="value"

使用变量:通过 $${} 引用:

echo $VAR_NAME      # 简单引用
echo ${VAR_NAME}    # 明确变量边界(推荐)

变量类型

  1. 局部变量:仅在当前 Shell 进程中有效。

    LOCAL_VAR="local"
    

  2. 环境变量:全局有效,可被子进程继承。

    export GLOBAL_VAR="global"
    

  3. 特殊变量

    • $0:脚本名称
    • $1, $2...:脚本参数
    • $#:参数个数
    • $?:上一条命令的退出状态(0 表示成功)

字符串操作

  1. 拼接字符串

    GREET="Hello"
    NAME="World"
    MESSAGE="$GREET, ${NAME}!"
    

  2. 获取长度

    STR="test"
    echo ${#STR}      # 输出 4
    

  3. 子字符串截取

    STR="abcdef"
    echo ${STR:1:3}   # 输出 bcd(从索引1开始,长度3)
    

数值运算

Shell 默认将变量视为字符串,需用 $(( ))let 进行算术运算。

NUM1=5
NUM2=3
SUM=$((NUM1 + NUM2))  # 输出 8

数组用法

  1. 定义数组

    ARRAY=("a" "b" "c")
    

  2. 访问元素

    echo ${ARRAY[1]}    # 输出 b(索引从0开始)
    

  3. 获取所有元素

    echo ${ARRAY[@]}    # 输出 a b c
    

只读变量与删除

  1. 只读变量:不可修改。

    readonly CONST="immutable"
    

  2. 删除变量

    unset VAR_NAME
    

变量默认值处理

  1. 未定义时使用默认值

    echo ${UNDEFINED_VAR:-"default"}  # 输出 default
    

  2. 未定义时赋值并返回

    echo ${UNDEFINED_VAR:="new_value"}  # 赋值后输出 new_value
    

示例综合

#!/bin/bash
USER="Alice"
echo "Hello, ${USER}!"
echo "Script name: $0"
echo "First argument: $1"

# 数组遍历
FRUITS=("Apple" "Banana" "Cherry")
for fruit in "${FRUITS[@]}"; do
    echo "Fruit: $fruit"
done

通过以上方法,可以灵活使用 Shell 变量处理字符串、数值、数组等场景。

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐