IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 条件测试语句和if流程控制语句 -> 正文阅读

[系统运维]条件测试语句和if流程控制语句

条件测试语句和if流程控制语句

1、read命令讲解

简介

我们编写脚本的时候通常需要使用到键盘输入;而计算机通过键盘输入而读取数据;

从键盘中读取变量的值,通常在shell脚本中与用户进行交互的场合,而read命令是可以一次性读取多个变量的值;

而输入的值都是需要用空格隔开;如果没有指定变量名,读取的数据将自动复制给到特定的变量;

[root@node0 ~]# read a b
liangjiawei sunjia
[root@node0 ~]# echo $a $b
liangjiawei sunjia

read命令

作用:通过键盘输入读取数值变量

语法:read + 选项

选项:

  • read + 变量–>等待输入的信息作为变量的值
  • read + 变量+变量:可以从第一个复制给变量,其余的都给到后面的变量
  • -s:隐藏输入的信息,可以吟唱输入的密码
  • -t:指定输入的时间,如果在规定的时间内没有任何输入会直接跳出read
  • -n:指定接收的输入字符的长度,
  • -r:支持输入的内容可以是特殊符号;
  • -p:指定输入的提示信息
[root@node0 ~]# read a b
liangjiawei wujinyuan sunjia
[root@node0 ~]# echo $a
liangjiawei
[root@node0 ~]# echo $b
wujinyuan sunjia


#隐藏信息
[root@node0 ~]# read -s passwd
[root@node0 ~]# echo $passwd
123456

#指定时间输入
[root@node0 ~]# read -t 2 a

#指定输入字符的长度
[root@node0 ~]# read -n 3 a
lia[root@node0 ~]# ng

#支持特殊符号的输入
[root@node0 ~]# read -r ab
、;‘’///\\\
[root@node0 ~]# echo $ab
、;‘’///\\\

[root@node0 ~]# read -p "please input you message: " ab
please input you message: liangjaiwei
[root@node0 ~]# echo $ab
liangjaiwei

#read 的脚本案例
[root@node0 ~]# vim read1.sh
#!/bin/bash
#read example
#by liangjaiwei
##################################
read -p "输入你的名字:" NAME
read -p "输入你的年龄:" AGE
read -p "输入你的性别:" SEX
cat <<EOF
****************
你的基本信息如下:
姓名:$NAME
年龄:$AGE
性别:$SEX
****************
EOF

#测试脚本
[root@node0 ~]# bash read1.sh 
输入你的名字:LIANGJIAWEI
输入你的年龄:18
输入你的性别:MAN
****************
你的基本信息如下:
姓名:LIANGJIAWEI
年龄:18
性别:MAN
****************

2、if流程控制语句

单分支语法格式

if+条件
	then
		命令
	fi

注意:$0可以用于判断命令执行的是否有问题,echo 出来的结果为0那么代表命令执行成功,如果非0,那么代表命令执行失败;

#简单的流程语句练习
[root@node0 ~]# vim if-1.sh
#!/bin/bash
#Useage:
#by liangjiawei 
##########################
if ls /mnt/ >/dev/zero &>1;then
        echo "it is ok"
fi

[root@node0 ~]# bash if-1.sh 
it is ok

双分支语法格式

if +条件;then
	命令
else
	命令
fi
#练习
[root@node0 ~]# vim if-2.sh
#!/bin/bash
#by liangjiawei 
#test
#######################
if grep root /etc/passwd; then
        echo "it is root"
else
        echo "it not root"
fi
[root@node0 ~]# bash if-2.sh 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
it is root

多分支语法格式

if + 条件测试操作1 ;then
	命令
elif 测试条件;then
	命令
elif 测试条件;then
	命令............
else
	命令..........
fi
#判断用户在系统中是否存在,是有存在家目录
[root@node0 ~]# vim if-3.sh
#!/bin/bash
#by liangjiawei
#########################
read -p "input a user name :"  NAME
if grep $NAME /etc/passwd  ;then
        echo "this user is $NAME is exists on the system"
elif ls -d /home/$NAME  ;then
        echo "the user $NAME not exists on the system"
        echo "the user $NMAE has home directory"
else
        echo "the user $NAME not exists on the system"
        echo "the user $NMAE not has  home directory"
fi

[root@node0 ~]# bash if-3.sh 
input a user name :liangjiawei
liangjiawei:x:1000:1000:liangjiawei:/home/liangjiawei:/bin/bash
this user is liangjiawei is exists on the system

3、test测试命令

shell中的test命令是用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试比较

语法:test+测试条件

如果测试的条件是对的、那么结果就为真,如果测试的条件是错的,那么结果就为假;使用echo $0输出的结果是0就是真的,非0就是加的;

数值的比较

参数说明示例
-eq等于则为真[ “ a ” ? e q “ a” -eq “ a?eqb” ]
-ne不等于则为真[ “ a ” ? n e “ a” -ne “ a?neb” ]
-gt大于则为真[ “ a ” ? g t “ a” -gt “ a?gtb” ]
-ge大于等于则为真[ “ a ” ? g e “ a” -ge “ a?geb” ]
-lt小于则为真[ “ a ” ? l t “ a” -lt “ a?ltb” ]
-le小于等于则为真[ “ a ” ? l e “ a” -le “ a?leb” ]

这里也能够发现其实test命令其实和中括号的意思是一样的,但是中括号就得使用两边都是空格

记住:整数的比较是不能带有小数点的;

例子如下

#比较两个数字的大小
[root@node0 ~]# vim test.sh
#!/bin/bash
#by liangjiawei
###################
if test 2 -eq 1 ;then
        echo "it is right"
else
        echo "it is error"
fi
[root@node0 ~]# bash test.sh 
it is error



#比较整数的大小
[root@node0 ~]# vim test.sh 
#!/bin/bash
#by liangjiawei
###################
read -p "Please input two number: " number1 number2
if [ $number1 -gt $number2  ];then
        echo "$number1 > $number2"
elif [ $number1 -lt $number2 ];then
        echo "$number1 < $number2"
else
        echo "$number1 = $number2"
fi

[root@node0 ~]# bash -x test.sh 
+ read -p 'Please input two number: ' number1 number2
Please input two number: 1 2
+ '[' 1 -gt 2 ']'
+ '[' 1 -lt 2 ']'
+ echo '1 < 2'
1 < 2

字符串的比较

参数说明
==等于则为真
!=不想
-z 字符串字符串的长度为0则为真
-n 字符串字符串的长度不为空则为真
str1 > str2大于为真
str1 < str2小于为真
#判断用户是否是超级用户
[root@node0 ~]# vim test1.sh
#!/bin/bash
#by liangjiawei
###################################
read -p "input your name: "  name
if [ $name ==  "root" ];then
        echo "you are super administrator;"
else
        echo "you are a general user"
fi
[root@node0 ~]# bash test1.sh 
input your name: root
you are super administrator;


在做字符串大小比较的时候,注意字符串的顺序;

  • 大于号和小于号必须转义,要不然SHELL会把它当成重定向符号
  • 大于和小于它们的顺序和sort排序是不一样的
  • 在test比较测试中,它使用的是ASCII顺序,大写字母是小于小写字母的;sort刚好相反

扩展: ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

[root@node0 ~]# vim test.sh
#!/bin/bash
#by liangjiawei
###################
VAR1=test
VAR2=Test
if [ $VAR1 \> $VAR2 ];then
        echo "$VAR1 > $VAR2"
else
        echo "$VAR1 < $VAR2"
fi

[root@node0 ~]# bash test.sh 
test > Test

文件比较

参数.说明示例
-e 文件名.如果文件或目录存在则为真[ -e file ]
-r 文件名.如果文件存在且可读则为真[ -r file ]
-w 文件名.如果文件存在且可写则为真[ -w file ]
-x 文件名.如果文件存在且可执行则为真[ -x file ]
-s 文件名如果文件存在且至少有一个字符则为真[ -s file ]
-d 文件名.如果文件存在且为目录则为真[ -d file ]
-f 文件名.如果文件存在且为普通文件则为真[ -f file ]
-c 文件名.如果文件存在且为字符型文件则为真[ -c file ]
-b 文件名…如果文件存在且为块特殊文件则为真[ -b file ]
file1 -nt fle2检查file1是否比file2新[ file1 -nt file2 ]
file1 -ot file2检查file1是否比file2旧[ file1 -ot file2 ]

示例:

退出码exit ,取值范围:0-255

[root@node0 ~]# vim test.sh
#!/bin/bash
#by liangjiawei
###################
if [ -e /etc/passwd ];then
        echo ok
else
        echo error
fi
[root@node0 ~]# bash test.sh 
ok

[root@node0 ~]# test -e /etc/passwd && echo ok || echo error
ok

#清空日志目录
[root@node0 ~]# vim clear-log.sh
#!/bin/bash
#clear /var/log/message
#确定当前是root用户
if [ $USER != "root" ];then
        echo "你必须使用root 用户才能执行脚本"
        exit 10 #直接退出,并且返回10
fi
#判断文件是否存在
if [ ! -f /var/log/messages ];then
        echo "文件不存在"
        exit 12
fi
#保留最近100行的日志内容
tail -100 /var/log/messages >> /var/log/mesg.tmp
#日志清理
> /var/log/messages
#cat /dev/null > /var/log/messages
mv /var/log/mesg.tmp /var/log/messages
echo "Logs clean up "

#测试
[root@node0 ~]# cat /var/log/messages

[root@node0 ~]# bash clear-log.sh 
Logs clean up 

4、流程控制过程中复杂条件和通配符

判断第一种

两个条件都为真或者有一个为真就执行

if [ 条件判断一 ] &&(||) [ 条件判断二 ];then
	命令一
elif [ 条件判断三 ] &&(||) [ 条件判断四 ];then
	命令二
else
	执行其他的
fi

判断第二种

if [ 条件判断一 -a(-o) 条件判断二 -a(-o) 条件判断三 ];then
	elif [条件判断三  -a (-o) 条件判断四 ]; then
else
   	执行其它
fi

判断第三种

if [[条件判断一 && (||) 条件判断二 ]]; then
elif [[ 条件判断三 && (||) 条件判断四 ]]; then
else
   执行其它
fi

参考一下umask的配置

[root@node0 ~]# vim /etc/profile
......
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

双括号和单括号的区别

[ [ …… ] ] 和 [ …… ]

双括号运算符是单括号运算符的扩充;

[ … ]能够支持通配符符号且不需要转义符

#支持通配符
[root@node0 ~]# if [[ $USER == r* ]];then echo "hello $USER" ;else echo "$USER not";fi
hello root

注: $USER == r*对比时,  r* 表示以r开头的任意长度字符串,这样就包括root

#使用单括号的用法
[root@node0 ~]# if [ $USER == r* ];then echo "hello $USER" ;else echo "$USER not";fi
root not
#对比时r* ,就表示两个字符串 r*

[root@node0 ~]# if [[ $USER == [a-z]oot ]];then echo "hello $USER";else echo "$USER not";fi
hello root

[[ …… ]]和[…….]的区别汇总

1、所有的字符与逻辑运算符直接用“空格”分开,不能连到一起。

2、在[ … ]表达式中,常见的> 、<需要加转义符\,大小比较

3、进行逻辑运算符&& 、||比较时;如果用的[ ]符号,则用在外面,如[… ] && [… ] || [ …]如果在[…]里面进行逻辑与或的比较,则用-a、-o进行表示,如[ x = y –a x < z –o x > m ]

4、[[… ]] 运算符只是[… ]运算符的扩充;能够支持< 、>符号运算不需要转义符;它还是以字符串比较大小。里面支持逻辑运算符 || 、 && , 不再使用-a 、-o

5、[[…]] 用 && 而不是 -a 表示逻辑“与”;用 || 而不是 -o表示逻辑“或”

6、[[… ]]可以进行算术扩展,而[ … ]不可以

7、[[…]]能用正则,而[…]不行

8、双括号(( ))用于数学表达式

9、双方括号号[[ ]]用于高级字符串处理,比如“模糊匹配”

shell中的通配符

字符含义实例
*****匹配 0 或多个字符a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
?匹配任意一个字符a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
[list]匹配 list 中的任意单一字符a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list]匹配 除list 中的任意单一字符a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
[c1-c2]匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。
{string1,string2,…}匹配 sring1 或 string2 (或更多)其一字符串a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。
[root@node0 ~]# ls /etc/*.conf
[root@node0 ~]# ls /etc/???.conf
/etc/sos.conf  /etc/yum.conf
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:25:19  更:2022-01-14 02:27:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 6:24:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码