第162集:变量与参数

教学目标

  • 掌握Shell脚本中变量的定义和使用方法
  • 了解不同类型的变量(局部变量、环境变量、特殊变量)
  • 熟悉Shell脚本参数的处理方法
  • 学习位置参数和特殊参数的使用
  • 能够在脚本中灵活使用变量和参数

主要知识点

  1. 变量的定义和使用
  2. 变量的类型
  3. 位置参数
  4. 特殊参数
  5. 变量的作用域
  6. 变量的扩展和替换

实用案例分析

案例1:Shell变量的定义和使用

目标:学习在Shell脚本中定义和使用变量。

操作步骤

  1. 创建变量演示脚本
# 创建脚本文件
touch variables-demo.sh

# 编辑脚本文件
vim variables-demo.sh

# 添加以下内容
#!/bin/bash
# 演示Shell变量的定义和使用

# 1. 定义变量
name="Linux User"
age=30
height=175.5
is_student=true

# 2. 使用变量
echo "Name: $name"
echo "Age: $age"
echo "Height: $height"
echo "Is student: $is_student"

# 3. 修改变量值
name="New Linux User"
age=$((age + 1))
echo "Updated name: $name"
echo "Updated age: $age"

# 4. 变量的算术运算
num1=10
num2=5
sum=$((num1 + num2))
difference=$((num1 - num2))
product=$((num1 * num2))
quotient=$((num1 / num2))
remainder=$((num1 % num2))

# 打印算术运算结果
echo "\nArithmetic operations:"
echo "$num1 + $num2 = $sum"
echo "$num1 - $num2 = $difference"
echo "$num1 * $num2 = $product"
echo "$num1 / $num2 = $quotient"
echo "$num1 % $num2 = $remainder"

# 5. 使用let命令进行算术运算
let num3=num1*2
echo "\nUsing let command:"
echo "num3 = num1 * 2 = $num3"

# 6. 使用expr命令进行算术运算
sum_expr=$(expr $num1 + $num2)
echo "\nUsing expr command:"
echo "sum_expr = $sum_expr"

# 7. 使用bc命令进行浮点运算
float_result=$(echo "$num1 / $num2" | bc -l)
echo "\nUsing bc command for floating point:"
echo "$num1 / $num2 = $float_result"
  1. 运行脚本并查看结果
# 设置执行权限
chmod +x variables-demo.sh

# 运行脚本
./variables-demo.sh

案例2:环境变量和特殊变量

目标:学习使用环境变量和特殊变量。

操作步骤

  1. 创建环境变量和特殊变量演示脚本
# 创建脚本文件
touch env-special-vars.sh

# 编辑脚本文件
vim env-special-vars.sh

# 添加以下内容
#!/bin/bash
# 演示环境变量和特殊变量

# 1. 环境变量
echo "=== Environment Variables ==="
echo "Home directory: $HOME"
echo "Shell: $SHELL"
echo "Path: $PATH"
echo "Username: $USER"
echo "Hostname: $HOSTNAME"
echo "Language: $LANG"
echo "Terminal: $TERM"

# 2. 特殊变量
echo "\n=== Special Variables ==="
echo "Script name: $0"
echo "Number of arguments: $#"
echo "All arguments: $*"
echo "All arguments as separate strings: $@"
echo "Last exit status: $?"
echo "Process ID: $$"
echo "Background process ID: $!"

# 3. 设置自定义环境变量
echo "\n=== Custom Environment Variables ==="
# 在脚本中设置环境变量(只在当前脚本中有效)
export CUSTOM_VAR="Hello from script"
echo "Custom variable: $CUSTOM_VAR"

# 4. 读取用户输入并存储到变量
read -p "Enter your name: " user_name
read -s -p "Enter your password: " user_pass
echo "\nHello, $user_name! Your password has been stored."

# 5. 变量的默认值
echo "\n=== Variable Default Values ==="
# 如果变量未定义,使用默认值
echo "Undefined variable with default: ${undefined_var:-default value}"

# 设置变量的默认值(如果未定义)
undefined_var=${undefined_var:-"new value"}
echo "Undefined variable after setting default: $undefined_var"

# 如果变量已定义,使用其值,否则使用默认值
existing_var="I exist"
echo "Existing variable with default: ${existing_var:-default value}"
  1. 运行脚本并查看结果
# 设置执行权限
chmod +x env-special-vars.sh

# 运行脚本(带参数)
./env-special-vars.sh arg1 arg2 arg3

案例3:位置参数的处理

目标:学习在Shell脚本中处理位置参数。

操作步骤

  1. 创建位置参数处理脚本
# 创建脚本文件
touch positional-params.sh

# 编辑脚本文件
vim positional-params.sh

# 添加以下内容
#!/bin/bash
# 演示位置参数的处理

# 检查参数数量
if [ $# -eq 0 ]; then
    echo "Usage: $0 <name> <age> <city>"
    exit 1
fi

# 1. 使用位置参数
echo "=== Positional Parameters ==="
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"
echo "Number of arguments: $#"

# 2. 遍历所有参数
echo "\n=== Iterating through all arguments ==="
echo "Using for loop with \$*:"
for arg in "$*"; do
    echo "Argument: $arg"
done

echo "\nUsing for loop with \$@:"
for arg in "$@"; do
    echo "Argument: $arg"
done

# 3. 移动位置参数
echo "\n=== Shifting positional parameters ==="
echo "Before shift:"
echo "First argument: $1"
echo "Second argument: $2"

# 移动位置参数(移除第一个参数)
shift
echo "\nAfter shift:"
echo "First argument: $1"
echo "Second argument: $2"
echo "Number of arguments: $#"

# 4. 处理可选参数
echo "\n=== Processing optional parameters ==="
# 默认值
name=${1:-"Unknown"}
age=${2:-"0"}
city=${3:-"Unknown"}

echo "Name: $name"
echo "Age: $age"
echo "City: $city"
  1. 运行脚本并查看结果
# 设置执行权限
chmod +x positional-params.sh

# 运行脚本(带不同数量的参数)
./positional-params.sh
./positional-params.sh Alice
./positional-params.sh Alice 25
./positional-params.sh Alice 25 New York

案例4:变量的作用域

目标:学习Shell脚本中变量的作用域。

操作步骤

  1. 创建变量作用域演示脚本
# 创建脚本文件
touch variable-scope.sh

# 编辑脚本文件
vim variable-scope.sh

# 添加以下内容
#!/bin/bash
# 演示变量的作用域

# 全局变量
global_var="Global variable"

# 定义函数
function test_scope() {
    # 局部变量
    local local_var="Local variable"
    # 修改全局变量
    global_var="Modified global variable"
    # 访问局部变量
    echo "Inside function:"
    echo "Local variable: $local_var"
    echo "Global variable: $global_var"
}

# 访问全局变量
echo "Before function:"
echo "Global variable: $global_var"

# 调用函数
test_scope

# 访问变量
echo "\nAfter function:"
echo "Global variable: $global_var"
# 尝试访问局部变量(会失败)
echo "Local variable: $local_var"

# 变量的可见性
echo "\n=== Variable Visibility ==="
# 在子Shell中定义变量
(child_var="Child variable"; echo "Inside subshell: child_var = $child_var")
# 尝试访问子Shell中的变量(会失败)
echo "Outside subshell: child_var = $child_var"
  1. 运行脚本并查看结果
# 设置执行权限
chmod +x variable-scope.sh

# 运行脚本
./variable-scope.sh

课后练习

  1. 基础练习

    • 创建一个脚本,使用变量存储个人信息并打印出来
    • 编写一个脚本,计算两个数的加、减、乘、除运算
    • 设计一个脚本,接受用户输入并显示输入内容
  2. 进阶练习

    • 创建一个脚本,处理多个位置参数并执行相应的操作
    • 编写一个脚本,使用环境变量配置脚本行为
    • 设计一个脚本,使用变量的默认值处理可选参数
  3. 挑战练习

    • 编写一个脚本,计算命令行参数中所有数字的总和
    • 创建一个脚本,根据位置参数执行不同的系统管理任务
    • 设计一个脚本,使用变量存储配置信息并根据配置执行不同的操作

总结

本集详细介绍了Linux Shell脚本中的变量和参数,包括变量的定义、使用、类型,以及脚本参数的处理等内容。通过学习这些知识,读者可以在Shell脚本中灵活使用变量和参数,提高脚本的灵活性和可维护性。

Shell脚本中的变量是存储数据的容器,而参数则允许脚本接收外部输入。掌握变量和参数的使用是编写复杂Shell脚本的基础。通过本集的学习,读者应该能够理解不同类型的变量,掌握变量的定义和使用方法,熟悉位置参数和特殊参数的处理,以及理解变量的作用域。

在实际应用中,变量和参数的灵活使用可以使Shell脚本更加通用和强大,能够处理各种复杂的任务。读者可以通过不断练习,逐渐掌握Shell脚本中变量和参数的高级用法。

« 上一篇 Shell 脚本基础 下一篇 » 条件判断