shell学习(变量)

  • Post author:
  • Post category:其他




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



版权声明:本文为hahaxixi131原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。