变量的定义

  • 变量如何定义
  • 变量的定义规则
  • 变量名区分大小写
  • 变量名不能有特殊符号
  • 变量名不能以数字开头
  • 等号两边不能有任何空格
  • 变量的定义方式
  • 基本方式
  • 命令执行结果赋值给变量
  • 交互式定义变量(read)
  • 实例
  • 定义有类型的变量(declare)
  • 实例
  • 变量的分类
  • 本地变量
  • 环境变量
  • 全局变量
  • 系统变量
  • 实例


变量如何定义

变量是用来临时保存数据的,该数据是可以变化的数据

变量名=变量值

变量名:用来临时保存数据的

变量值:就是临时的可变化的数据

[root@maomao ~]# A=hello      定义变量A
[root@maomao ~]# echo $A      调用变量A,在shell里一定要加"$"
hello
[root@maomao ~]# echo ${A}    还可以这样调用
hello
[root@maomao ~]# A=world      因为是变量所以可以变
[root@maomao ~]# echo $A     
world
[root@maomao ~]# unset A      取消变量
[root@maomao ~]# echo $A      不能再调用了

变量的定义规则

变量名也是有一定的要求,不能随便乱取

变量名区分大小写

[root@maomao ~]# A=hello
[root@maomao ~]# a=world
[root@maomao ~]# echo $A
hello
[root@maomao ~]# echo $a
world

变量名不能有特殊符号

[root@maomao ~]# ?A=hello
-bash: ?A=hello: command not found
[root@maomao ~]# @A=hello
-bash: @A=hello: command not found

# 如果有空格的字符串赋值给变量 需要加""
[root@maomao ~]# A=hello world
-bash: world: command not found
[root@maomao ~]# A="hello world"

变量名不能以数字开头

[root@maomao ~]# 8A=hello
-bash: 8A=hello: command not found
[root@maomao ~]# A8=hello
[root@maomao ~]# echo $A8
hello

注意:不能以数字开头,但以英文开头后面可以跟数字

等号两边不能有任何空格

# 敲习惯python之后 每次=两边都习惯敲空格 但shell里面变量的赋值是不能有空格的 >.<!!!

[root@maomao ~]# A =123
-bash: A: command not found
[root@maomao ~]# A= 123
-bash: 123: command not found
[root@maomao ~]# A = 123
-bash: A: command not found
[root@maomao ~]# A=123
[root@maomao ~]# echo $A
123

变量的定义方式

基本方式

直接赋值给一个变量

[root@maomao ~]# zhu=12345678
[root@maomao ~]# echo $zhu
12345678
[root@maomao ~]# echo ${zhu:2:4}        表示从A变量中第3个字符开始截取,截取4个字符
3456
# 类似python里面的切片 但python里面print(zhu[2:4])表示只截取下标2到3的字符

说明:
$变量名 和 ${变量名}的异同
相同点:都可以调用变量
不同点:${变量名}可以只截取变量的一部分,而$变量名不可以

命令执行结果赋值给变量

[root@maomao ~]# zhu=`date +"%F %T"`
[root@maomao ~]# echo $zhu
2021-03-27 01:39:06
[root@maomao ~]# mao=$(uname -r)
[root@maomao ~]# echo $mao
3.10.0-1160.11.1.el7.x86_64

交互式定义变量(read)

read很重要,能够让用户自己给变量赋值
语法:

read [选项] 变量名

常见选项:

选项

作用

-p

定义提示用户的信息

-n

定义字符数(限制变量值的长度)

-s

不显示(不显示用户输入的内容)

-t

定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)

实例

# -n 
[root@maomao ~]# read -n 5 -p 'pls input a number:' num
pls input a number:12345[root@maomao ~]# 6789	超过5个数字不让输了

# -s 不显示输入的值
[root@maomao ~]# read -s -p 'pls input a number:' num
pls input a number:

# -t
[root@maomao ~]# read -t3 -p 'pls input a number:' num
pls input a number:12345[root@maomao ~]# 12345	3秒内没输完程序直接结束

read一般在脚本里让用户输入想要的值赋给变量
和python input一样

read还可以读取文件里面的值赋给变量
[root@maomao ~]# cat ip.txt 
192.168.188.188 255.255.255.0

[root@maomao ~]# read ip mask < ip.txt 
[root@maomao ~]# echo $ip
192.168.188.188
[root@maomao ~]# echo $mask
255.255.255.0

脚本里一般常用于while read 读取文件里面的每一行

定义有类型的变量(declare)

给变量做一些限制,固定变量的类型,比如:整型、只读

语法:

declare 选项 变量名=变量值

常用选项:

选项

作用

-i

将变量看成整数

-r

定义只读变量

-a

定义普通数组;查看普通数组

-A

定义关联数组;查看关联数组

-x

将变量通过环境导出

实例

# -i	规定变量只能是整数
[root@maomao ~]# declare -i num=123
[root@maomao ~]# echo $num
123
[root@maomao ~]# num=aaa
[root@maomao ~]# echo $num
0

[root@maomao ~]# a=10;b=20;c=a+b
[root@maomao ~]# echo $c
a+b

[root@maomao ~]# declare -i a
[root@maomao ~]# declare -i b
[root@maomao ~]# declare -i c
[root@maomao ~]# echo $c
a+b
[root@maomao ~]# c=a+b
[root@maomao ~]# echo $c
30

# -r	规定变量成为只读变量 不能修改了
[root@maomao ~]# declare -r mao=helloworld
[root@maomao ~]# echo $mao
helloworld
[root@maomao ~]# mao=python
-bash: mao: readonly variable
[root@maomao ~]# unset mao
-bash: unset: mao: cannot unset: readonly variable

# -a -A 是数组相关的 以后再写

变量的分类

本地变量

本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效

环境变量

环境变量:当前进程有效,并且能够被子进程调用。

  • env查看当前用户的环境变量
  • set查询当前用户的所有变量(临时变量与环境变量)
  • export 变量名=变量值 或者 变量名=变量值;export 变量名 或者 declare -x 变量名=变量值
# 临时设定一个环境变量
[root@maomao ~]# export zhu=helloworld
[root@maomao ~]# env|grep ^zhu
zhu=helloworld

# 永久生效需要去 vim /etc/profile 或者 ~/.bashrc
export zhu=helloworld
或者
zhu=helloworld
export zhu

系统中有一个变量PATH,环境变量
export PATH=/usr/local/mysql/bin:$PATH

全局变量

全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.

相关配置文件:

文件名

说明

备注

~/.bashrc

当前用户的bash信息,用户登录时读取

局部。定义别名、umask、函数等

~/.bash_profile

当前用户的环境变量信息,用户登录时读取

局部。

~/.bash_logout

当前用户退出当前shell时最后读取

局部。定义用户退出时执行的程序等

~/.bash_history

当前用户的历史命令

局部。history -w保存历史记录 history -c清空历史记录

/etc/bashrc

全局的bash信息

全局。所有用户都生效

/etc/profile

全局环境变量信息

全局。系统和所有用户都生效

以上文件修改后,都需要重新source让其生效

  • 用户登录系统读取相关文件的顺序
  1. /etc/profile
  2. $HOME/.bash_profile
  3. $HOME/.bashrc
  4. /etc/bashrc
  5. $HOME/.bash_logout

说明:本地变量、环境变量、全局变量是根据变量的作用域来区分的。

系统变量

系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.

内置变量

含义

$?

上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误

$0

当前执行的程序或脚本名

$#

脚本后面接的参数的个数

$*

脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开

$@

脚本后面所有参数,参数是独立的,也是全部输出

$1~$9

脚本后面的位置参数,$1表示第1个位置参数,依次类推

{n}

扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来)

$$

当前所在进程的进程号,如echo $$

$!

后台运行的最后一个进程号 (当前终端)

!$

调用最后一条命令历史中的参数

实例

# $? 这是最常使用的系统变量
执行一段命令 然后echo $? 来查看返回值是否为0 从而判断命令是否执行成功

# 比如 判断防火墙是否关闭
pgrep firewalld &>/dev/null
if [ $? -eq 0 ];then
        systemctl stop firewalld &>/dev/null
fi

# 判断软件是否安装 都可以使用$?
rpm -q expect &>/dev/null
if [ $? -ne 0 ];then
        [ $UID -eq 0 ] && yum install -y expect &>/dev/null || echo "你没有权限安装expect"
fi


# $0	如果要使用位置变量 需要告诉用户怎么使用 
if [ $# -ne 3 ];then
        echo "usage:`basename $0` par1 par2 par3"
        exit
fi

# $* 和 $@都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以$1$2 … $n的形式输出所有参数。
# 但是当它们被双引号(” “)包含时,$* 会将所有的参数作为一个整体,以"$1$2 … $n"的形式输出所有参数;$@会将各个参数分开,以$1 $2 … $n单个的形式输出所有参数。

#!/bin/bash
for i in "$@"
do
echo $i
done

echo "======我是分割线======="

for i in "$*"
do
echo $i
done

[root@maomao ~]# bash 3.sh a b c
a
b
c
======我是分割线=======
a b c

详细了解一下位置变量

[root@maomao shell]# vim test.sh
#!/bin/bash
	echo "这是第二个位置变量:$2"
	echo "这是第一个位置变量:$1"
	echo "这是第四个位置变量:$4"
	echo "这是第五个位置变量:$5"
	echo "所有的参数是:$*"
	echo "参数的个数是:$#"
	echo "当前进程的PID是:$$"

[root@maomao shell]# bash test.sh 1 2 3 4 5
		这是第二个位置变量:2
		这是第一个位置变量:1
		这是第四个位置变量:4
		这是第五个位置变量:5
		所有的参数是:1 2 3 4 5
		参数的个数是:5
		当前进程的PID是:2026