一、变量定义、查看和取消
1.什么是变量
以固定名称存放的可能会变化的值
——提高脚本对任务需求、运行环境变化的适应能力
——在脚本执行中方便重复使用某个值
2.定义/赋值变量
基本格式
变量名=变量值
相关注意事项
若指定的变量名已存在,相当于为此变量重新赋值(修改)
等号两边不要有空格
变量名由字母/数字/下划线组成,区分大小写
变量名不能以数字开头,不要使用关键字和特殊字符
$ X=12
$ var1=CentOS
3.查看/引用变量
基本格式
引用变量值: $变量名
查看变量值: echo $变量名
echo ${变量名}
$ echo $X
12
$ echo $var1
CentOS
$ echo $var16.5 //未定义的变量无取值
.5
$ echo ${var1}6.5 //变量名易混淆时,以{}界定
CentOS6.5
4.取消变量
自定义变量的失效
退出定义变量的Shell环境时,变量会自动失效的
在环境内也可手动取消:unset 变量名
$ unset X
$ echo $X
二、变量的种类
变量的分类角度
-
存储类型
整数型、浮点型、双精度浮点型、字符型、…… Shell不作为高级编程语言,对存储类型的要求比较松散,故在此不作存储类型上的区分
-
使用类型
类型 | 说明 |
---|---|
环境变量 | 变量名通常大写,由系统维护,用来设置工作环境,其中只有个别变量用户可以直接更改 |
位置变量 | 由bash内置,用来存储在执行脚本时提供的命令行参数 |
预定义变量 | 由bash内置,一类有特殊用途的变量,可以直接调用,但不能直接赋值或修改 |
自定义变量 | 由用户自主设置、修改及使用 |
环境变量
配置文件(不同操作系统配置文件名不一)
/etc/profile //所有用户都起作用
~/.bash_profile //只对当前用户起作用
相关操作
env 列出所有的环境变量
set 列出所有变量
常见的环境变量
PWD 查看当前用户所在文件夹
PATH 存储用户在执行命令时默认到哪些文件夹下找命令程序
USER 记录用户名称
LOGNAME 登录名称
UID 用户数字标识
SHELL 保存当前用户对应的登录解释器路径
HOME 保存用户所在家目录的路径
PS1 决定命令行默认提示符 [\u@\h\W]\$ 当前用户名 主机名 工作目录
PS2 第二级提示符
位置变量
在执行脚本时提供的命令行参数;表示为$n, n为序号
$1、$2、…… ${10}、${11}、……
#!/bin/bash
echo $1 ${10} //查看第1、10个位置参数
如下:改造前,功能有限
#!/bin/bash
useradd love 2> /tmp/err.log
echo 123456 | passwd --stdin love &> /dev/null
如下:改造后,功能更灵活
#!/bin/bash
useradd $1 2> /tmp/err.log
echo 123456 | passwd --stdin $1 &> /dev/null
预定义变量
用来保存脚本程序的执行信息
直接使用这些变量
不能直接为这些变量赋值
变量名 | 含义 |
---|---|
$0 | 当前所在的进程或脚本名 |
$$ | 当前运行进程的PID号 |
$? | 前一条命令执行后的返回状态值,0表示正常或成功,1或其他表示异常 |
$# | 已加载的位置变量的个数 |
$* | 所有位置变量的值 |
$! | 后台最后一个进程的PID号 |
e.g.
# touch afile.txt
# echo $?
0 //前一条命令成功
# touch adir/afile.txt
touch:无法碰触 "adir/afile.txt":没有那个文件或目录
# echo $?
1 //前一条命令异常/失败
自定义变量
定义方法
变量名=变量值
变量名的设置规则
由数字/字母/下划线组成,区分大小写
不能以数字开头
等号两边不要有空格
不要使用关键字和特殊字符
查看变量值
echo $变量名
注:$ : 通过指定变量名称引用变量值
撤销变量
unset 变量名
查看变量定义
set | grep 变量名
三、扩展赋值操作
1、注意区分三种定界符
双引号"": 允许扩展,通过$引用其他变量
单引号'': 禁用扩展,即便$也视为普通字符
反撇号``: 将命令的执行输出作为变量值
# echo "当前用户是:$USER"
当前用户是:root
# echo "当前用户是:$USER"
当前用户是:$USER
# echo 当前工作目录:$(pwd)
当前工作目录:/root
注:$()与``等效,但$()更方便嵌套使用
引号( 双引号与单引号)在赋值中的应用示例
1)双引号
在双引号内允许$扩展,可调用其他变量的值
出现特殊字符时,可采用\符号转义( 常见的转义字符:\n换行符 \t制表位 \\ \" \#)
当变量值不包括空格、制表符时,双引号通常被省略
$ A=CentOS7.6
$ B=$A
$ echo $B
CentOS7.6
//有空格时,引号不可省略
$ B=$A Server //未加引号时报错
-bash:Server:command not found
$ B="$A Server"
$ echo $B
CentOS7.6 Server
$ A="a\tb\tc\nd\te"
$ echo -e $a //添加-e选项解析特殊义符
$ FN="\\\""
$ touch /root/$FN.txt //可以在命令行内嵌入变量的值
$ ls -lh \\\".txt
2)单引号
所有字符均视为字符本身(无特殊含义)
不允许\转义,有利于保留特殊字符
$ A=CentOS7.6
$ B='$A Server' //$被视为普通字符
$ echo $B //确认赋值结果
$A Server
2.从标准输入赋值
read从键盘录入数据完成赋值
read取值的用法
基本格式
read 变量名 ... ...
read [-p "提示信息"] 变量名 .. .. (-p方便添加自定义交互,-t可指定超时秒数)
# read -p "svr5 login:" YOUR_NAME //模拟登录取用户名
svr5 login: Jerry
# echo $YOUR_NAME //查看取值结果
Jerry
静默取值
启动read命令的-s选项
关闭输入回显(从键盘录入信息时,不显示在屏幕上)
适合读入敏感信息,提高安全性
# read -s -p "Password:" YOUR_PASS //模拟登录取密码
# echo $YOUR_PASS //查看取值结果
read取值示例
提示用户输入要备份的文件夹路径
使用tar命令备份该文件夹,存放到/opt/目录下
# cat /root/dirbak.sh //确认脚本内容
#!/bin/bash
read -p "请指定要备份的目录位置:" SDIR
tar zcpPf /opt/dirbak.tgz $SDIR
3.变量的作用范围
局部变量
只在定义此变量的当前Shell环境下有效
自定义变量默认都是局部变量
无法在子Shell环境中使用
全局变量
在当前Shell及所有的子Shell环境下都有效
子Shell中若赋值同名变量,与父Shell中的变量无关
使用export可将局部变量声明为全局变量
发布全局变量
export 局部变量名[=变量值] .. ..
直接定义/赋值指定的变量,作为全局变量发布
对已有的局部变量,只需发布不需赋值
# X=123 //定义局部变量X
# export Y=456 //定义全局变量Y
# bash //进入新开启的子Shell环境
# echo $X,$Y //查看变量X、Y的值
,456
# exit //返回原有Shell环境
exit
# echo $X,$Y //查看变量X、Y的值
123,456
取消全局变量
export -n 全局变量名 .. ..
取消变量的全局属性
此操作对局部变量无实际意义
# export -n Y //将全局变量Y改为局部变量
# bash //进入新开启的子Shell环境
# echo $Y //在子Shell中Y为未定义的变量