shell变量

shell变量分为四种:自定义变量、环境变量、位置变量、预定义变量

自定义变量:用户本身自己定义的变量

环境变量 例:USER SHELL(解释器) HOME PATH(命令存放路径)

echo $PS1 一级提示符

echo $PS2 二级提示符

echo $UID 查看当前用户ID

位置变量 $1,$2,$3…

echo 变量格式保持不变 echo $变量_全局变量

测试变量效果
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,

echo 变量格式保持不变 echo $变量_shell_02

a=$(date)   //结果等同于反撇号

删除变量值
unset  a   #清空变量值

echo 变量格式保持不变 echo $变量_全局变量_03


发布全局变量(全局变量不局限于当前解释器,)

a=10

export a //对已有变量,发布为全局变量

export a=10 //创建变量,发布为全局变量

取消全局变量

export -n a

测试:创建一个全局变量a,开启一个新的bash解释器测试a的值,取消全局变量a,然后再次测试a的值

echo 变量格式保持不变 echo $变量_全局变量_04

shell中的运算

echo 变量格式保持不变 echo $变量_用户名_05

[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 $[21]
 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
 14shell条件测试
常用条件判断:
== (等于)
 !=(不等于)
 -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