一、变量是什么?
变量:变量就是用来临时保存数据的,并且是可以变化的数据。
二、 什么时候需要使用变量
- 如果脚本需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。这样在修改内容的时候,仅仅需要修改变量的值。
- 在脚本运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,就可以直接使用这个变量。
三、 如何定义变量?
变量名=变量值
[root@converts shells]# name='胖太乙' # 定义变量名 name
[root@converts shells]# echo $name # 读取变量名 name 中的值
胖太乙
[root@converts shells]# echo ${name} # 读取变量名 name 中的值
胖太乙
[root@converts shells]# unset name # 取消变量
[root@converts shells]# echo $name
[root@converts shells]#
四. 变量的定义规则
1、变量名区分大小写
[root@converts shells]# name='胖太乙'
[root@converts shells]# Name='Big胖太乙'
[root@converts shells]# echo $name
胖太乙
[root@converts shells]# echo $Name
Big胖太乙
[root@converts shells]#
2、变量名不能有特殊符号
[root@converts shells]# *name='胖太乙'
-bash: *name=胖太乙: command not found
[root@converts shells]# &name='胖太乙'
-bash: syntax error near unexpected token `&'
3、变量名不能以数字开头
[root@converts shells]# 1name='胖太乙'
-bash: 1name=胖太乙: command not found
[root@converts shells]#
4、等号两边不能有任何空格
[root@converts shells]# name = '胖太乙'
-bash: name: command not found
五、变量的自定义方式有那些?
1、基本方式
$变量名 和 ${变量名} 的区别:
- 相同点: 都可以调用变量
- 不同点: ${变量名} 可以只截取变量值的某一部分, 而$变量名不行。
[root@converts shells]# name='胖太乙'
[root@converts shells]# echo $name
胖太乙
[root@converts shells]# echo ${name:1:2}
太乙
[root@converts shells]#
2、命令执行结果赋值给变量
# 获取当前系统的时间
[root@converts shells]# time=`date +%F`
[root@converts shells]# echo $time
2021-12-10
# 获取系统版本信息
[root@converts shells]# version=$(uname -r)
[root@converts shells]# echo $version
4.18.0-305.3.1.el8.x86_64
[root@converts shells]#
3、交互式定义变量(read)
目的: 让用户自己 给变量赋值,比较灵活。
语法:read [选项] 变量名
常见选项:
选项 | 释义 |
---|---|
-p | 定义提示用户的信息 |
-n | 定义字符数(限制变量值的长度) |
-s | 不显示(不显示用户输入的内容) |
-t | 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间) |
# 1.普通用法
[root@converts shells]# read name
胖太乙
[root@converts shells]# echo $name
胖太乙
# 2.带有提示信息的用法
[root@converts shells]# read -p '你的博客名称叫什么?' name
你的博客名称叫什么?胖太乙
[root@converts shells]# echo $name
胖太乙
[root@converts shells]#
拓展:变量值来自于某个文件
[root@converts shells]# cat user.txt
张三 15岁
李四 30岁
胖太乙 1000岁
[root@converts shells]# read name age < user.txt
[root@converts shells]# echo $name
张三
[root@converts shells]# echo $age
15岁
[root@converts shells]#
4、定义有类型的变量(declare)
目的: 给变量做一些限制,固定变量的类型,比如:整型、只读
用法: declare 选项 变量名=变量值
常用选项:
选项 | 释义 | 举例 |
---|---|---|
-i | 将变量看成整数 | declare -i A=123 |
-r | 定义只读变量 | declare -r B=hello |
-a | 定义普通数组;查看普通数组 | |
-A | 定义关联数组;查看关联数组 | |
-x | 将变量通过环境导出 | declare -x AAA=123456 等于 export AAA=123456 |
六、变量的分类
1、本地变量
当前用户自定义的变量。当前进程
中有效,其他进程及当前进程的子进程无效。
2、环境变量
- 环境变量: 当前进程有效,并且能够被子进程调用。
- env:查看当前用户的环境变量
- set:查询当前用户的所有变量(临时变量与环境变量)
- export:变量名=变量值 或者 变量名=变量值;export 变量名
[root@converts shells]# export name='胖太乙' # 临时将一个本地变量(临时变量)变成环境变量
[root@converts shells]# env | grep ^name
name=胖太乙
[root@converts shells]#
3、全局变量
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
解读相关配置文件
文件名 | 说明 | 备注 |
---|---|---|
$HOME/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义别名、umask、函数等 |
$HOME/.bash_profile | 当前用户的环境变量,用户登录时读取 | |
$HOME/.bash_logout | 当前用户退出当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
$HOME/.bash_history | 用户的历史命令 | history -w 保存历史记录 history -c 清空历史记录 |
4、系统变量
系统变量(内置bash中变量): shell本身已经固定好了它的名字和作用
内置变量 | 含义 |
---|---|
$? | 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误(※ 常用) |
$0 | 当前执行的程序或脚本名 |
$# | 脚本后面接的参数的个数 |
$* | 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 |
$@ | 脚本后面所有参数,参数是独立的,也是全部输出 |
$1~$9 | 脚本后面的位置参数,$1表示第1个位置参数,依次类推 |
${10}~${n} | 扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来) |
$$ | 当前所在进程的进程号,如echo $$ |
$! | 后台运行的最后一个进程号 (当前终端) |
!$ | 调用最后一条命令历史中的参数 |
5、测试
# 有一个Demo.sh 的脚本文件, 脚本内容如下
[root@converts shells]# cat Demo.sh
#!/bin/bash
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
# 无参执行
[root@converts shells]# ./Demo.sh
$0 = ./Demo.sh
$# = 0
$* =
$@ =
$1 =
$2 =
$3 =
$11 =
# 带1个参数执行脚本
[root@converts shells]# ./Demo.sh 1
$0 = ./Demo.sh
$# = 1
$* = 1
$@ = 1
$1 = 1
$2 =
$3 =
$11 =
# 带2个参数执行脚本
[root@converts shells]# ./Demo.sh 1 2
$0 = ./Demo.sh
$# = 2
$* = 1 2
$@ = 1 2
$1 = 1
$2 = 2
$3 =
$11 =
# 带3个参数执行脚本
[root@converts shells]# ./Demo.sh 1 2 3
$0 = ./Demo.sh
$# = 3
$* = 1 2 3
$@ = 1 2 3
$1 = 1
$2 = 2
$3 = 3
$11 =
# 带12个参数执行脚本
[root@converts shells]# ./Demo.sh 1 2 3 4 5 6 7 8 9 10 11 12
$0 = ./Demo.sh
$# = 12
$* = 1 2 3 4 5 6 7 8 9 10 11 12
$@ = 1 2 3 4 5 6 7 8 9 10 11 12
$1 = 1
$2 = 2
$3 = 3
$11 = 11
[root@converts shells]#
暂无评论