变量的定义
- 变量如何定义
- 变量的定义规则
- 变量名区分大小写
- 变量名不能有特殊符号
- 变量名不能以数字开头
- 等号两边不能有任何空格
- 变量的定义方式
- 基本方式
- 命令执行结果赋值给变量
- 交互式定义变量(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让其生效
- 用户登录系统读取相关文件的顺序
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- /etc/bashrc
- $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