变量的定义
1.变量是什么?
变量是用来临时保存数据的,该数据是可以变换的数据
2.什么时候需要定义变量?
-
如果某个内容需要多次使用,并且在代码中 重复出现,那么可以用变量代表该内容。这样在
修改内容的时候,仅仅需要修改变量的值
-
在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,
就可以直接使用这个变量
3.变量如何定义?
变量名=变量值
变量名:用来临时保存数据
变量值:临时的可变化的数据
[root@shell shell01]# A=hello 定义变量A
[root@shell shell01]# echo $A
hello
[root@shell shell01]# echo ${A}
hello
[root@shell shell01]# A=world
[root@shell shell01]# echo $A
world
[root@shell shell01]# unset A 取消变量
[root@shell shell01]# echo $A
[root@shell shell01]#
4.变量的定义规则
虽然可以给变量(变量名)赋予任何值,但是,对于变量名也是有要求的
变量名尽量使用大写,见名知意
(1)变量名区分大小写
[root@shell shell01]# A=hello
[root@shell shell01]# a=world
[root@shell shell01]# echo $A
hello
[root@shell shell01]# echo $a
world
[root@shell shell01]#
(2)变量名不能有特殊符号
[root@shell shell01]# ?B=123
bash: ?B=123: 未找到命令...
[root@shell shell01]# *B=123
bash: *B=123: 未找到命令...
[root@shell shell01]# $B=123
bash: =123: 未找到命令...
[root@shell shell01]# #B=123
[root@shell shell01]# echo $#B $#有特殊含义
0B
[root@shell shell01]# echo ${#B} ${#有特殊含义
0
[root@shell shell01]#
特别说明:变量值中有空格,用引号引起来
[root@shell shell01]# A="hello world"
[root@shell shell01]# echo $A
hello world
(3)变量名不能以数字开头
[root@shell shell01]# 12A=hello
bash: 12A=hello: 未找到命令...
[root@shell shell01]# A12=hello
[root@shell shell01]# echo $A12
hello
(4)等号两边不能有空格
[root@shell shell01]# A =hello
bash: A: 未找到命令...
[root@shell shell01]# A= hello
bash: hello: 未找到命令...
[root@shell shell01]# A = hello
bash: A: 未找到命令...
[root@shell shell01]# A=hello
[root@shell shell01]# echo $A
hello
5.变量的定义方式有哪些?
(1)基本方式
直接赋值给一个变量
[root@shell shell01]# A=123456
[root@shell shell01]# echo $A
123456
[root@shell shell01]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符
3456
说明:
$变量名和${变量名}异同
相同点:都可以调用变量
不同点:${变量名}可以只截取变量的一部分
(2)命令执行结果赋值给变量
[root@shell shell01]# A=`hostname`
[root@shell shell01]# echo $A
shell
[root@shell shell01]# B=$(uname -r)
[root@shell shell01]# echo $B
3.10.0-957.el7.x86_64
[root@shell shell01]# B=`uname -r`
[root@shell shell01]# echo $B
3.10.0-957.el7.x86_64
(3)交互式定义变量(read)
目的:让用户自己给变量赋值,比较灵活
语法:read [选项] 变量名
常见选项:
-p 定义提示用户的信息
-n 定义字符数(限制变量值的长度)
-s 不显示(不显示用户输入的内容)
-t 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)
举例说明:
(a)用户自己定义变量值
1.用户自己定义变量值
[root@shell shell01]# read NAME
Jay
[root@shell shell01]# echo $NAME
Jay
2.定义提示用户的信息
[root@shell shell01]# read -p "Input your name:" NAME
Input your name:ZHOU
[root@shell shell01]# echo $NAME
ZHOU
3.不显示用户输入的内容
[root@shell shell01]# read -s -p "Input your password:" PASSWD
Input your password:
[root@shell shell01]# echo $PASSWD
000000
4.限制变量的长度
[root@shell shell01]# read -n 5 -p "Input your name:" NAME
Input your name:ZHANG[root@shell shell01]# 输入字符数达到5会自动退出
[root@shell shell01]# echo $NAME
ZHANG
5.限制超时时间
[root@shell shell01]# read -t 3 -p "Input your name:" NAME
Input your name:aaaaaaaaaaaaaaa[root@shell shell01]# 超出时间会退出
[root@shell shell01]# echo $NAME
在时间内未输入回车,则变量为空
[root@shell shell01]#
b)变量值来自文件
[root@shell shell01]# cat ip.txt
10.1.1.1
[root@shell shell01]# read -p "请输入IP地址:" IP < ip.txt
[root@shell shell01]# echo $IP
10.1.1.1
[root@shell shell01]# cat stu.txt
JayZhou 男
[root@shell shell01]#
[root@shell shell01]# read -p "请输入信息:" NAME SEX < stu.txt
[root@shell shell01]# echo $NAME
JayZhou
[root@shell shell01]# echo $SEX
男
(4)定义有类型的变量(declare)
目的:给变量做一些限制,固定变量的类型,比如:整型、只读...
用法:declare [选项] 变量名=变量值
常用选项:
-i 将变量看成整数 declare -i A=123
-r 定义只读变量 declare -r B=hello
-a 定义普通数组;查看普通数组 之后再说
-A 定义关联数组;查看关联数组 之后再说
-x 将变量通过环境导出 declare -x AAA=123456 等于 export AAA=123456
举例说明:
1.整数 -i
[root@shell shell01]# A=123
[root@shell shell01]# echo $A
123
[root@shell shell01]# A=hello
[root@shell shell01]# echo $A
hello
[root@shell shell01]# declare -i A=123
[root@shell shell01]# echo $A
123
[root@shell shell01]# A=hello
[root@shell shell01]# echo $A
0
[root@shell shell01]# A=333
[root@shell shell01]# echo $A
333
2.只读 -r
[root@shell shell01]# declare -r B=hello
[root@shell shell01]# echo $B
hello
[root@shell shell01]# B=8888
-bash: B: 只读变量
[root@shell shell01]# unset B
-bash: unset: B: 无法反设定: 只读 variable
[root@shell shell01]# 如果想撤销变量,需要重新登录用户,因为declare只在当前终端生效
3.环境变量 -x
[root@shell shell01]# AAAA=zhang
[root@shell shell01]# echo $AAAA
zhang
[root@shell shell01]# env | grep AAAA
[root@shell shell01]# export AAAA
[root@shell shell01]# env | grep AAAA
AAAA=zhang
[root@shell shell01]# declare -x BBBB=zhou
[root@shell shell01]# env | grep BBBB
BBBB=zhou
6.变量的分类
(1) 本地变量
-
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效
(2) 环境变量
-
环境变量:当前进程有效,并且能够被子进程调用
-
env 查看当前用户的环境变量
-
set 查询当前用户的所有变量(临时变量与环境变量)
-
export 变量名=变量值
-
(3) 全局变量
-
全局变量:全局所有的程序和用户都可以调用,且继承、新建的用户也默认能调用
-
解读相关配置文件:
文件名 | 说明 | 备注 |
---|---|---|
$HOME/.bashrc | 当前用户的bash信息,用户 登录 时读取 | 定义别名、umask、函数等 |
$HOME/.bash_profile | 当前用户的环境变量,用户 登录 时读取 | |
$HOME/.bash_logout | 当前用户 退出 当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
$HOME/.bash_history |
说明:以上文件修改后,都需要重新 source 让其生效或者重新登录
-
用户登录系统读取相关文件的顺序 1. /etc/profile 2. $HOME/.bash_profile 3. $HOME/.bashrc 4. /etc/bashrc 5. $HOME/.bash_logout
(4) 系统变量
-
系统变量(内置bash中变量):shell本身已经固定好了它的名字和作用
内置变量 | 含义 |
---|---|
$? | 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误 |
$0 | 当前执行的程序或脚本名 |
$# | 脚本后面接的参数的个数 |
$* | 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 |
$@ | 脚本后面所有参数,参数是独立的,也是全部输出 |
$1~$9 | 脚本后面的位置参数,$1表示第1个位置参数,依此类推 |
${10}~${n} | 扩展位置参数,第10个位置变量必须用{}大括号括起来(两位数字以上括起来) |
$$ | 当前所在进程的进程号,如echo $$ |
$! | 后台运行的最后一个进程号(当前终端) |
!$ | 调用最后一条命令历史中的参数 |
[root@shell test]# cat variable.sh
#!/bin/env bash
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$10 = ${10}"
echo "系统变量!!!"
[root@shell test]#
[root@shell test]# ./variable.sh 1 2 3 4 5 6 7 8 9 10
$0 = ./variable.sh
$# = 10
$* = 1 2 3 4 5 6 7 8 9 10
$@ = 1 2 3 4 5 6 7 8 9 10
$1 = 1
$2 = 2
$3 = 3
$10 = 10
系统变量!!!
[root@shell test]#