变量的定义

在Shell脚本中,变量就像是小箱子,你可以给这个箱子起一个名字,然后把需要存储的东西放进去。当你需要使用这个东西时,只需告诉计算机箱子的名字,它就会把里面的东西取出来给你使用。就像在玩一个魔术盒子一样,你把需要的东西放进去,需要的时候再取出来使用。这样,你可以方便地在脚本中存储数据,并在需要的时候使用这些数据。

变量的常见类型

Shell变量分为以下几类

  • 自定义变量
  • 系统环境变量
  • 位置参数变量
  • 预定义变量

1.自定义变量

  1. 定义变量:通过 变量名=变量值 的方式可以定义自定义变量。
  2. 引用变量:使用 $变量名${变量名} 的形式可以引用自定义变量的值。
  3. 查看变量:可以使用 echo $变量名 来查看特定自定义变量的值。另外,使用 set 命令可以显示所有变量,包括自定义变量和环境变量。
  4. 取消变量:要取消一个自定义变量,可以使用 unset 变量名 命令。这个操作的作用范围仅限于当前 shell。
  5. 作用范围:自定义变量仅在当前 shell 中有效,不会被传递到子 shell。

2.系统环境变量

  1. 定义环境变量:通过使用命令 export 变量名,可以将自定义的变量转换成系统环境变量。
  2. 引用环境变量:系统环境变量可以通过 $变量名${变量名} 的方式进行引用。
  3. 查看环境变量:可以使用命令 echo $变量名 来查看特定环境变量的值,或者使用 env | grep 变量名 来列出包含特定字符串的所有环境变量。
  4. 取消环境变量:要取消一个环境变量,可以使用 unset 变量名 命令。
  5. 变量作用范围:系统环境变量在当前 shell 以及其子 shell 中都是有效的,但在其他 shell 中则可能无效。

3.位置参数变量

  1. 定义位置参数变量:在执行脚本或函数时,通过命令行传递参数给脚本或函数,这些参数会被自动赋值给位置参数变量,形如 $1, $2, $3, …,分别代表第一个、第二个、第三个位置的参数,以此类推。
  2. 引用位置参数变量:使用 $数字 的形式引用位置参数变量的值,例如 $1 表示第一个位置的参数,$2 表示第二个位置的参数,以此类推。
  3. 查看位置参数变量:通常不直接查看位置参数变量,而是在脚本或函数中通过 $数字 的方式来使用它们。
  4. 作用范围:位置参数变量仅在当前执行的脚本或函数中有效,不会被传递到其他脚本或函数中。
  5. 举例:假设有一个脚本 example.sh,执行命令 ./example.sh apple banana orange,那么在 example.sh 中可以通过 $1 获取 apple,通过 $2 获取 banana,通过 $3 获取 orange,依此类推。

4.预定义变量

  1. $0:当前脚本的文件名。
  2. $1, $2, … n:脚本或函数的参数。$1是第一个参数,$2是第二个参数,依此类推。
  3. **$@**:所有传递给脚本或函数的参数的列表。
  4. **$#**:传递给脚本或函数的参数个数。
  5. **$?**:上一个命令的退出状态或返回值。
  6. **$$**:当前Shell进程的进程ID(PID)。
  7. **$!**:后台运行的最后一个进程的进程ID。
  8. $USER:当前用户的用户名。
  9. $HOME:当前用户的主目录。
  10. $PWD:当前工作目录的路径。
  11. $SHELL:当前Shell的路径。
  12. $RANDOM:一个随机数。

示例:

  1. $0:当前脚本的文件名。

    echo "当前脚本的文件名是:$0"
  2. $1, $2, … n:脚本或函数的参数。$1是第一个参数,$2是第二个参数,依此类推。

    echo "第一个参数是:$1"
    echo "第二个参数是:$2"
  3. **$@**:所有传递给脚本或函数的参数的列表。

    echo "所有参数:$@"
  4. **$#**:传递给脚本或函数的参数个数。

    echo "参数个数:$#"
  5. **$?**:上一个命令的退出状态或返回值。

    ls non_existent_file
    echo "上一个命令的退出状态:$?"
  6. **$$**:当前Shell进程的进程ID(PID)。

    echo "当前Shell进程的PID是:$$"
  7. **$!**:后台运行的最后一个进程的进程ID。

    sleep 10 &
    echo "后台运行的最后一个进程的PID是:$!"
  8. $USER:当前用户的用户名。

    echo "当前用户的用户名是:$USER"
  9. $HOME:当前用户的主目录。

    echo "当前用户的主目录是:$HOME"
  10. $PWD:当前工作目录的路径。

    echo "当前工作目录的路径是:$PWD"
  11. $SHELL:当前Shell的路径。

    echo "当前Shell的路径是:$SHELL"
  12. $RANDOM:一个随机数。

    echo "一个随机数是:$RANDOM"

变量赋值方式

在Shell编程中,可以使用以下方式对变量进行赋值:

  1. 直接赋值:使用等号(=)进行赋值。

    variable_name=value
  2. 间接赋值:使用双括号来间接引用变量。

    variable_name="indirect_variable"
    indirect_variable="value"
    echo ${!variable_name} # 输出: value
  3. 命令赋值:将命令的输出结果赋值给变量。

    variable_name=$(command)
  4. 将输出重定向到变量:将命令的输出结果直接重定向到变量。

    variable_name=`command`
  5. 声明变量并赋值:使用declaretypeset关键字声明变量并赋值。

    declare variable_name=value
  6. 读取用户输入并赋值:使用read命令从用户处读取输入并将其赋值给变量。

    read variable_name
    read -p "请输入您的姓名: " variable_name
    read -t 5 -p "请输入您的姓名(5秒内): " variable_name
    read -n 2 variable_name #读取2个字符
  7. 赋值给数组:将值赋给数组变量的特定索引。

    array_name[index]=value

引用变量

在Shell中,使用双引号和单引号引用变量有一些区别:

  1. 双引号(” “):

    • 使用双引号引用变量时,变量会被扩展,即变量的值会被替换到引号内。例如:var="Hello",然后 echo "$var" 会输出 Hello
    • 双引号内可以包含其他特殊字符(如空格、制表符等),它们不会被特殊处理,而是作为普通字符对待。
    • 双引号内的命令替换和算术扩展会被执行。例如:echo "Today is $(date)" 会输出当前日期。
  2. 单引号(’ ‘):

    • 使用单引号引用变量时,变量不会被扩展,而是作为普通字符串对待。例如:var="Hello",然后 echo '$var' 会输出 $var 而不是 Hello
    • 单引号内的特殊字符被视为普通字符,不会被特殊处理,包括 $ 符号也会被当作普通字符对待。
    • 单引号内不允许执行命令替换和算术扩展。

例如:

var="Hello"
echo "Double quotes: $var" # 输出: Double quotes: Hello
echo 'Single quotes: $var' # 输出: Single quotes: $var

变量数值运算

在Shell脚本中,你可以进行数值运算并将结果保存到变量中。一般来说,可以使用expr命令或者使用双括号(( ))进行数值计算。

使用expr命令:

# 定义变量
num1=10
num2=5

# 加法
sum=$(expr $num1 + $num2)
echo "Sum: $sum"

# 减法
difference=$(expr $num1 - $num2)
echo "Difference: $difference"

# 乘法
product=$(expr $num1 \* $num2) # 乘法需要使用反斜杠转义
echo "Product: $product"

# 除法
quotient=$(expr $num1 / $num2)
echo "Quotient: $quotient"

# 求余
remainder=$(expr $num1 % $num2)
echo "Remainder: $remainder"

使用双括号(( ))

# 定义变量
num1=10
num2=5

# 加法
sum=$((num1 + num2))
echo "Sum: $sum"

# 减法
difference=$((num1 - num2))
echo "Difference: $difference"

# 乘法
product=$((num1 * num2))
echo "Product: $product"

# 除法
quotient=$((num1 / num2))
echo "Quotient: $quotient"

# 求余
remainder=$((num1 % num2))
echo "Remainder: $remainder"

注意事项:

  • 在使用expr时,运算符周围需要有空格,而使用(( ))时不需要空格。
  • 对于乘法,使用expr时需要对*进行转义,而在(( ))中不需要。
  • expr只能处理整数运算,而(( ))可以处理浮点数运算。
  • 在进行除法时,如果除数为0,expr会报错,而(( ))会输出错误信息但不会终止脚本执行。

使用let命令:

在Shell中,let命令通常用于执行整数运算。它允许你在Shell脚本中进行基本的算术运算,例如加法、减法、乘法和除法。下面是一些示例用法:

# 定义变量并进行加法运算
let "result = 5 + 3"
echo "5 + 3 = $result" # 输出:5 + 3 = 8

# 定义变量并进行减法运算
let "result = 10 - 4"
echo "10 - 4 = $result" # 输出:10 - 4 = 6

# 定义变量并进行乘法运算
let "result = 6 * 3"
echo "6 * 3 = $result" # 输出:6 * 3 = 18

# 定义变量并进行除法运算
let "result = 20 / 4"
echo "20 / 4 = $result" # 输出:20 / 4 = 5

你还可以在let命令中使用变量,例如:

# 定义两个变量并进行加法运算
a=10
b=5
let "result = a + b"
echo "$a + $b = $result" # 输出:10 + 5 = 15

注意,在let命令中,变量名前不需要添加$符号。