shell有两类变量,临时变量和永久变量。
- 临时变量:是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。
- 永久变量:也称为环境变量,其值不会随着shell脚本的执行结束而消失。
- $PATH:系统会去哪些目录中寻找可执行程序的环境变量
- $HOME:当前登录用户的主文件夹
[root@VM_16_6_centos ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
用户自定义变量:由字母或下划线打头。由字母、数字、下划线组成,并且大小写字母意义不同。变量名长度没有限制。
使用变量时,在变量名前加“$”
变量赋值(“=”符号两边不能有空格)
- 直接赋值:
[root@VM_16_6_centos ~]# A=aaa
[root@VM_16_6_centos ~]# echo $A
aaa
- 将一个命令的执行结果赋值给一个变量:
[root@VM_16_6_centos ~]# A=`date`
[root@VM_16_6_centos ~]# echo $A
Thu Mar 5 15:37:45 CST 2020
- 将一个命令赋值给一个变量:
[root@VM_16_6_centos ~]# B=$(ls -l)
[root@VM_16_6_centos ~]# echo $B
total 1980 -rw-r--r-- 1 root root 19 Mar 4 18:52 example.sh -rw-r--r-- 1 root root 2023006 Nov 20 01:06 redis-stable.tar.gz
给变量赋值多个单词(""或''):
[root@VM_16_6_centos ~]# NAME="zhang san"
[root@VM_16_6_centos ~]# echo $NAME
zhang san
[root@VM_16_6_centos ~]#
[root@VM_16_6_centos ~]# NAME='li si'
[root@VM_16_6_centos ~]# echo $NAME
li si
- 单引号和双引号的区别:
-- 单引号之间的内容是把字符串原封不动的指定给了变量。
-- 双引号不仅是取消了空格的作用,特殊符号的含义也会保留。 - 例:
[root@VM_16_6_centos ~]# NAME='li si'
[root@VM_16_6_centos ~]# NAME="zhang san $NAME"
[root@VM_16_6_centos ~]# echo $NAME
zhang san li si
查看变量
- 列出所有变量:
set - 使用set过滤变量:
set | grep A - 删除变量:
[root@VM_16_6_centos ~]# echo $NAME
zhang san $NAME
[root@VM_16_6_centos ~]# unset NAME
[root@VM_16_6_centos ~]# echo $NAME
[root@VM_16_6_centos ~]#
位置变量和特殊变量
- 位置变量(或位置参数):
shell解释执行用户的命令时,将命令行的第一个字作为命令名,而其他字作为参数(位置变量)。
位置变量使用$N
来获取。$0
是运行程序的文件名,$1~$N
代表运行程序的N个参数值。
[root@VM_16_6_centos ~]# cat example.sh
echo "hello world"
echo $0
echo $1
echo $2
echo $3
[root@VM_16_6_centos ~]# bash example.sh param1 param2 param3
hello world
example.sh
param1
param2
param3
- 特殊变量:
有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而是称它为特殊变量。这些变量当程序一开始执行时就会存在,以下是一些特殊变量:
- $*
当前程序的所有参数 - $#
当前程序的参数个数 - $$
当前程序的PID - $!
执行上一个后台程序的PID(注:上一个后台指令必须要以&结尾否则无法获取到PID) - $?
执行上一个指令的返回值
编写测试脚本:
[root@VM_16_6_centos ~]# cat z.sh
#!/bin/bash
echo "$* 表示这个程序的所有参数 "
echo "$# 表示这个程序的参数个数 "
touch /tmp/a.txt
echo "$$ 表示程序的进程ID "
touch /tmp/b.txt &
echo "$! 执行上一个后台指令的PID "
echo "$$ 表示程序的进程ID "
执行测试脚本:
[root@VM_16_6_centos ~]# sh z.sh param1 param2
param1 param2 表示这个程序的所有参数
2 表示这个程序的参数个数
13562 表示程序的进程ID
13564 执行上一个后台指令的PID
13562 表示程序的进程ID
网友评论