变量
变量的定义
在Shell脚本中,变量就像是小箱子,你可以给这个箱子起一个名字,然后把需要存储的东西放进去。当你需要使用这个东西时,只需告诉计算机箱子的名字,它就会把里面的东西取出来给你使用。就像在玩一个魔术盒子一样,你把需要的东西放进去,需要的时候再取出来使用。这样,你可以方便地在脚本中存储数据,并在需要的时候使用这些数据。
变量的常见类型
Shell变量分为以下几类
- 自定义变量
- 系统环境变量
- 位置参数变量
- 预定义变量
1.自定义变量
- 定义变量:通过
变量名=变量值的方式可以定义自定义变量。 - 引用变量:使用
$变量名或${变量名}的形式可以引用自定义变量的值。 - 查看变量:可以使用
echo $变量名来查看特定自定义变量的值。另外,使用set命令可以显示所有变量,包括自定义变量和环境变量。 - 取消变量:要取消一个自定义变量,可以使用
unset 变量名命令。这个操作的作用范围仅限于当前 shell。 - 作用范围:自定义变量仅在当前 shell 中有效,不会被传递到子 shell。
2.系统环境变量
- 定义环境变量:通过使用命令
export变量名,可以将自定义的变量转换成系统环境变量。 - 引用环境变量:系统环境变量可以通过
$变量名或${变量名}的方式进行引用。 - 查看环境变量:可以使用命令
echo $变量名来查看特定环境变量的值,或者使用env | grep 变量名来列出包含特定字符串的所有环境变量。 - 取消环境变量:要取消一个环境变量,可以使用
unset 变量名命令。 - 变量作用范围:系统环境变量在当前 shell 以及其子 shell 中都是有效的,但在其他 shell 中则可能无效。
3.位置参数变量
- 定义位置参数变量:在执行脚本或函数时,通过命令行传递参数给脚本或函数,这些参数会被自动赋值给位置参数变量,形如
$1,$2,$3, …,分别代表第一个、第二个、第三个位置的参数,以此类推。 - 引用位置参数变量:使用
$数字的形式引用位置参数变量的值,例如$1表示第一个位置的参数,$2表示第二个位置的参数,以此类推。 - 查看位置参数变量:通常不直接查看位置参数变量,而是在脚本或函数中通过
$数字的方式来使用它们。 - 作用范围:位置参数变量仅在当前执行的脚本或函数中有效,不会被传递到其他脚本或函数中。
- 举例:假设有一个脚本
example.sh,执行命令./example.sh apple banana orange,那么在example.sh中可以通过$1获取apple,通过$2获取banana,通过$3获取orange,依此类推。
4.预定义变量
- $0:当前脚本的文件名。
- $1, $2, … n:脚本或函数的参数。$1是第一个参数,$2是第二个参数,依此类推。
- **$@**:所有传递给脚本或函数的参数的列表。
- **$#**:传递给脚本或函数的参数个数。
- **$?**:上一个命令的退出状态或返回值。
- **$$**:当前Shell进程的进程ID(PID)。
- **$!**:后台运行的最后一个进程的进程ID。
- $USER:当前用户的用户名。
- $HOME:当前用户的主目录。
- $PWD:当前工作目录的路径。
- $SHELL:当前Shell的路径。
- $RANDOM:一个随机数。
示例:
$0:当前脚本的文件名。
echo "当前脚本的文件名是:$0"
$1, $2, … n:脚本或函数的参数。$1是第一个参数,$2是第二个参数,依此类推。
echo "第一个参数是:$1"
echo "第二个参数是:$2"**$@**:所有传递给脚本或函数的参数的列表。
echo "所有参数:$@"
**$#**:传递给脚本或函数的参数个数。
echo "参数个数:$#"
**$?**:上一个命令的退出状态或返回值。
ls non_existent_file
echo "上一个命令的退出状态:$?"**$$**:当前Shell进程的进程ID(PID)。
echo "当前Shell进程的PID是:$$"
**$!**:后台运行的最后一个进程的进程ID。
sleep 10 &
echo "后台运行的最后一个进程的PID是:$!"$USER:当前用户的用户名。
echo "当前用户的用户名是:$USER"
$HOME:当前用户的主目录。
echo "当前用户的主目录是:$HOME"
$PWD:当前工作目录的路径。
echo "当前工作目录的路径是:$PWD"
$SHELL:当前Shell的路径。
echo "当前Shell的路径是:$SHELL"
$RANDOM:一个随机数。
echo "一个随机数是:$RANDOM"
变量赋值方式
在Shell编程中,可以使用以下方式对变量进行赋值:
直接赋值:使用等号(=)进行赋值。
variable_name=value
间接赋值:使用双括号来间接引用变量。
variable_name="indirect_variable"
indirect_variable="value"
echo ${!variable_name} # 输出: value命令赋值:将命令的输出结果赋值给变量。
variable_name=$(command)
将输出重定向到变量:将命令的输出结果直接重定向到变量。
variable_name=`command`
声明变量并赋值:使用
declare或typeset关键字声明变量并赋值。declare variable_name=value
读取用户输入并赋值:使用
read命令从用户处读取输入并将其赋值给变量。read variable_name
read -p "请输入您的姓名: " variable_name
read -t 5 -p "请输入您的姓名(5秒内): " variable_name
read -n 2 variable_name #读取2个字符赋值给数组:将值赋给数组变量的特定索引。
array_name[index]=value
引用变量
在Shell中,使用双引号和单引号引用变量有一些区别:
双引号(” “):
- 使用双引号引用变量时,变量会被扩展,即变量的值会被替换到引号内。例如:
var="Hello",然后echo "$var"会输出Hello。 - 双引号内可以包含其他特殊字符(如空格、制表符等),它们不会被特殊处理,而是作为普通字符对待。
- 双引号内的命令替换和算术扩展会被执行。例如:
echo "Today is $(date)"会输出当前日期。
- 使用双引号引用变量时,变量会被扩展,即变量的值会被替换到引号内。例如:
单引号(’ ‘):
- 使用单引号引用变量时,变量不会被扩展,而是作为普通字符串对待。例如:
var="Hello",然后echo '$var'会输出$var而不是Hello。 - 单引号内的特殊字符被视为普通字符,不会被特殊处理,包括
$符号也会被当作普通字符对待。 - 单引号内不允许执行命令替换和算术扩展。
- 使用单引号引用变量时,变量不会被扩展,而是作为普通字符串对待。例如:
例如:
var="Hello" |
变量数值运算
在Shell脚本中,你可以进行数值运算并将结果保存到变量中。一般来说,可以使用expr命令或者使用双括号(( ))进行数值计算。
使用expr命令:
# 定义变量 |
使用双括号(( )):
# 定义变量 |
注意事项:
- 在使用
expr时,运算符周围需要有空格,而使用(( ))时不需要空格。 - 对于乘法,使用
expr时需要对*进行转义,而在(( ))中不需要。 expr只能处理整数运算,而(( ))可以处理浮点数运算。- 在进行除法时,如果除数为0,
expr会报错,而(( ))会输出错误信息但不会终止脚本执行。
使用let命令:
在Shell中,let命令通常用于执行整数运算。它允许你在Shell脚本中进行基本的算术运算,例如加法、减法、乘法和除法。下面是一些示例用法:
# 定义变量并进行加法运算 |
你还可以在let命令中使用变量,例如:
# 定义两个变量并进行加法运算 |
注意,在let命令中,变量名前不需要添加$符号。