shell变量
shell变量分为四种:自定义变量、环境变量、位置变量、预定义变量
自定义变量:用户本身自己定义的变量
环境变量 例:USER SHELL(解释器) HOME PATH(命令存放路径)
echo $PS1 一级提示符
echo $PS2 二级提示符
echo $UID 查看当前用户ID
位置变量 $1,$2,$3…
测试变量效果
echo $1
echo $2
echo $3
echo $$ #程序进程号
echo $# #所有位置变量的数量
echo $* #显示所有的位置变量
echo $@ #与$*作用一致,加引号作用不一样,$*作为一个整体,$@作为多个字符串
echo $? #检测上一条指令的结果 0:正确 非0:错误
echo $0 #脚本执行名称
echo $! #查看最后一条放入后台的程序进程号
echo $_ #获得上一条命令的最后一个参数
env #显示所有的环境变量
echo ${#s} #显示变量s的长度
3种引号的使用
” ” 界定范围
[root@ha131 shell]# a=10
[root@ha131 shell]# echo “$a”
10
' ' 界定范围,可以屏蔽特殊符号
echo '$a'
$a
(反撇号)得到指令的结果
a=date //定义变量a,
a=$(date) //结果等同于反撇号
删除变量值
unset a #清空变量值
发布全局变量(全局变量不局限于当前解释器,)
a=10
export a //对已有变量,发布为全局变量
export a=10 //创建变量,发布为全局变量
取消全局变量
export -n a
测试:创建一个全局变量a,开启一个新的bash解释器测试a的值,取消全局变量a,然后再次测试a的值
shell中的运算
[root@ha131 /]# expr 1 + 1
2
[root@ha131 /]# expr 2 – 1
1
[root@ha131 /]# expr 2 ‘
’ 1
2
[root@ha131 /]# expr 2 * 2
4
[root@ha131 /]# expr 2 / 2
1
[root@ha131 /]# expr 20 % 2
0
2. echo $[ ] 或者 echo $(())也能支持上述五种方式
[root@ha131 /]# echo $[1+1]
2
[root@ha131 /]# echo $[2-1]
1
[root@ha131 /]# echo $[2
1]
2
[root@ha131 /]# echo $[2/1]
2
[root@ha131 /]# echo $[1%1]
0
3. let 可以改变变量本身的值,不显示结果
[root@ha131 /]# a=10;b=1
[root@ha131 /]# let a++
[root@ha131 /]# echo $a
11
[root@ha131 /]# let a+=2
[root@ha131 /]# echo $a
13
[root@ha131 /]# let a+=b
[root@ha131 /]# echo $a
14
shell条件测试
常用条件判断:
== (等于)
!=(不等于)
-z (判断变量是否为空)
!-z(判断变量是否不为空)
-n(效果等同于!-z,测试时变量加引号)
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
-e 判断对象是否存在
-d 判断对象是否为目录
-f 判断对象是否问文件
-r 判断文件是否可读 对root无效
-w 判断文件是否可写 对root无效
-x 判断文件是否可执行
&& 且
|| 或
; 前面任务执行完毕后,继续执行后续任务,前后无逻辑关系
[ abc == abc ] //常量对比 ,echo $?得到结果
[root@ha131 /]# [ abc == abc ]
[root@ha131 /]# echo $?
0
判断是否为root
[ $UID -le 0 ]
[ $USER != root ] (不是管理员)
[ $USER == root ] //使用环境变量对比当前用户身份
echo $? //通过查看返回值来判断身份
逻辑符号 && (前面执行成功后面继续执行 ) ||(前面执行失败后面继续执行)
例:
[root@ha131 ~]# [ $USER == root ] && echo 123 //用户为管理员,才输出123
123
[root@ha131 ~]# [ $USER != root ] && echo 123
[root@ha131 ~]# [ $USER != root ] || echo 123
123
-z 判断变量是否为空
[root@ha131 ~]# a=
[root@ha131 ~]# [ -z $a ]
[root@ha131 ~]# echo $?
0
[root@ha131 ~]# a=10
[root@ha131 ~]# [ -z $a ]
[root@ha131 ~]# echo $?
1
例:编写一个创建用户的脚本,用户输入用户名和密码,当用户输入用户名为空时,退出脚本
#! /bin/bash
read -p "请输入您要创建的用户名: " a
[ -z $a ] && echo "用户名输入为空" && exit # 输入为空退出脚本
useradd $a &> /dev/null
echo 用户$a创建成功
stty -echo #关闭回显
read -p '请输入你要设置的密码' b
echo ${b:-123} | passwd --stdin $a &> /dev/null
stty echo #开启回显
echo 用户$a密码设置成功
; 前面任务执行完毕后,继续执行后续任务,前后无逻辑关系
数字对比(不支持小数)
[root@ha131 ~]# [ 0123 -eq 123 ]
[root@ha131 ~]# echo $?
0
[root@ha131 ~]# [ 0123 == 123 ]
[root@ha131 ~]# echo $?
1
数字对比如果使用 ==可能会出现错误
-e 判断对象是否存在
[root@ha131 shell]# mkdir /root/bai
[root@ha131 shell]# [ -e /root/bai ]
[root@ha131 shell]# echo $?
1
[root@ha131 shell]# mkdir /root/bai
[root@ha131 shell]# [ -e /root/bai ]
[root@ha131 shell]# echo $?
0
-d 判断对象是否为目录
-f 判断对象是否问文件
[root@ha131 shell]# [ -f /root/bai ]
[root@ha131 shell]# echo $?
1
[root@ha131 shell]# [ -d /root/bai ]
[root@ha131 shell]# echo $?
0
判断文件权限
-r 是否可读 对root无效
-w 是否可写 对root无效
-x 是否可执行
测试文件权限
[root@ha131 shell]# touch a
[root@ha131 shell]# ll
total 12
-rw-r–r–. 1 root root 0 Jun 22 17:58 a
-rw-r–r–. 1 root root 116 Jun 13 23:55 a.sh
-rwxr-xr-x. 1 root root 235 Jun 21 20:51 ceshi.sh
-rwxr-xr-x. 1 root root 371 Jun 21 19:23 useradd.sh
[root@ha131 shell]# [ -r a ]
[root@ha131 shell]# echo $?
0
[root@ha131 shell]# [ -w a ]
[root@ha131 shell]# echo $?
0
[root@ha131 shell]# [ -x a ]
[root@ha131 shell]# echo $?
1
[root@ha131 shell]# [ -d a ] && echo “mkdir” || echo “touch”
touch
[root@ha131 shell]# [ -f a ] && echo “mkdir” || echo “touch”
mkdir
[root@ha131 shell]# [ -e a ] && echo “mkdir” || echo “touch”
mkdir
[root@ha131 shell]# rm a
[root@ha131 shell]# [ ! -e a ] && echo “mkdir” || echo “touch”
mkdir
-n 的效果等同于 !-z (-n测试时,变量加” “)
[root@ha131 shell]# a=
[root@ha131 shell]# [ -z $a ] && echo $?
0
[root@ha131 shell]# [ ! -z $a ] && echo $? || echo $?
1
[root@ha131 shell]# [ -n “$a” ] && echo $? || echo $?
1