表达式
简介:所谓的表达式,就是在场景需求的前提下,判断数据和运算符的操作是否满足需求。
语法格式
格式
真实值 操作符 真实值 比较运算符 预期值
示例
3 + 4 > 6
要点:
表达式应该具有判断的功能
测试表达式
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败。
使用专门的测试工具---test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)
测试表达式(test或【】)
用于条件判断,返回真(0)或返回假(非0)
数值比较
$a -eq $b # 等于
$a -ne $b # 不等于
$a -gt $b # 大于
$a -lt $b # 小于
$a -ge $b # 大于等于
$a -le $b # 小于等于
字符串比较
"$str1" = "$str2" # 等于
"$str1" != "$str2" # 不等于
-z "$str" # 空字符串
-n "$str" # 非空字符串
文件测试
-e file # 存在
-f file # 是普通文件
-d file # 是目录
-r file # 可读
-w file # 可写
-x file # 可执行
-s file # 非空
测试表达式
样式1: test 条件表达式
样式2: 条件表达式
注意:
以上两种方法的作用完全一样,后者为常用。
但后者需要注意方括号、与条件表达式之间至少有一个空格。
test跟 \[\] 的意思一样
条件成立,状态返回值是0
条件不成立,状态返回值是1
简单示例
test语法示例
root@localhost \~# test 1 == 1
root@localhost \~# echo $?
0
root@localhost \~# test 1 == 2
root@localhost \~# echo $?
1
test -v语法测试变量有没有被设置值,亦可理解为变量是否为空。
root@localhost \~# echo $empty
root@localhost \~# test -v empty
root@localhost \~# echo $?
1
root@localhost \~# empty=value
root@localhost \~# echo $?
0
语法示例
\[\] 语法示例
root@localhost \~\]# \[ 1 == 1
root@localhost \~# echo $?
0
root@localhost \~\]# \[ 1 == 12
root@localhost \~# echo $?
1
格式解读
\[\] 格式解读
root@localhost \~\]# \[ 1 == 12
bash: : 缺少 \`'
root@localhost \~\]# \[ 1 == 12\]
root@localhost \~# echo $?
1
逻辑表达式
简介
逻辑表达式一般用于判断多个条件之间的依赖关系。
常见的逻辑表达式有:&& 和 ||,根据观察的角度不同含义也不同
语法解读
&&
示例:命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 -- 夫唱妇随
如果命令1执行失败,那么命令2也不执行
||示例:命令1 || 命令2
如果命令1执行成功,那么命令2不执行 -- 对着干
如果命令1执行失败,那么命令2执行
!示例:! 命令
如果命令执行成功,则整体取反状态
组合使用方法
使用样式:
命令1 && 命令2 || 命令3
方便理解的样式 ( 命令1 && 命令2 ) || 命令3
功能解读:
命令1执行成功的情况下,执行命令2
命令2执行失败的情况下,执行命令3
注意:
&& 必须放到前面,|| 放到后面
简单实践
实践1-语法实践
&& 语法实践
root@localhost \~# 1 = 1 && echo "条件成立"
条件成立
root@localhost \~# 1 = 2 && echo "条件成立"
|| 语法实践
root@localhost \~# 1 = 2 || echo "条件不成立"
条件不成立
root@localhost \~# 1 = 1 || echo "条件不成立"
root@localhost \~#
实践2-案例实践
执行文件前保证具备执行权限
root@localhost \~#cat test_argumn.sh
#!/bin/bash
#&& 和 || 演示
#设定普通量
arg_num=$#
$# == 1 && echo "脚本参数为1,允许执行脚本"
$# == 1 || echo "脚本参数不为1,不允许执行脚本"
脚本执行后效果root@localhost \~#/bin/bash test_argnum.sh
脚本参数不为1,不允许执行脚本
root@localhost \~# /bin/bash test_argnum.sh 1
脚本参数为1,允许执行脚本
root@localhost \~# /bin/bash test_argnum.sh 1 2
脚本参数不为1,不允许执行脚本
实践3-取反
查看正常的字符串判断
root@localhost \~\]# \[ aaa == aaa
root@localhost \~# echo $?
0
查看取反的效果判断
root@localhost \~\]# \[ ! aaa == aaa
root@localhost \~# echo $?
1
root@localhost \~\]# \[ ! aaa == bbb
root@localhost \~# echo $?
0
实践4-组合使用
root@localhost \~# -d /etc && echo "目录存在" || echo "目录不存在"
目录存在
root@localhost \~# -d /etc1 && echo "目录存在" || echo "目录不存在"
目录不存在
实践5- 主机网络连通测试
查看脚本内容
root@localhost \~# cat host_network_test.sh
#!/bin/bash
功能:测试主机网络连通性
版本:v0.1
作者:书记
联系:www.superopsmsb.com
定制普通变量
host_addr="$1"
脚本基本判断
-z ${host_addr} && echo "请输入待测试主机ip" && exit
$# -ne 1 && echo "请保证输入1个脚本参数" && exit
测试主机网络
net_status=(ping -c1 -w1 {host_addr} >/dev/null 2>&1 && echo "正常" || echo "异常")
信息输出
echo -e "\e[31m\t主机网络状态信息\e[0m"
echo -e "\e[32m================================"
echo "{host_addr} 网络状态: {net_status}"
echo -e "================================\e[0m"
脚本执行效果root@localhost \~# /bin/bash host_network_test.sh
请输入待测试主机ip
root@localhost \~# /bin/bash host_network_test.sh aa bb
请保证输入1个脚本参数
root@localhost \~# /bin/bash host_network_test.sh 10.0.0.12
主机网络状态信息
================================
10.0.0.12 网络状态: 正常
================================
root@localhost \~# /bin/bash host_network_test.sh 10.0.0.15
主机网络状态信息
================================
10.0.0.15 网络状态: 异常
================================
字符串表达式
简介: 所谓的字符串表达式,主要是判断 比较运算符 两侧的值的内容是否一致,由于bash属于弱类型语言,所以,默认情况下,无论数字和字符,都会可以被当成字符串进行判断。
符号解读
内容比较判断
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
内容空值判断
-z str 空值判断,获取字符串长度,长度为0,返回True
-n "str" 非空值判断,获取字符串长度,长度不为0,返回True
注意:str外侧必须携带"",否则无法判断
简单实践
实践1-内容比较判断
判断字符串内容是否一致
root@localhost \~# test aaa == bbb
root@localhost \~# echo &?
1
root@localhost \~# test aaa != bbb
root@localhost \~# echo $?
0
判断数字内容是否一致
root@localhost \~# num1=234 num2=456
root@localhost \~# test num1 == num2
root@localhost \~# echo $?
1
root@localhost \~# test num1 != num2
root@localhost \~# echo $?
0
实践2-空值判断
判断内容是否为空
root@localhost \~# string=nihao
root@localhost \~# test -z $string
root@localhost \~# echo $?
1
root@localhost \~# test -z $string1
root@localhost \~# echo $?
0
判断内容是否为不空,可以理解为变量是否被设置
root@localhost \~# unset str
root@localhost \~\]# \[ -n $str
root@localhost \~# echo $?
0
root@localhost \~\]# \[ -n "$str"
root@localhost \~# echo $?
1
root@localhost \~# str=value
root@localhost \~\]# \[ -n "$str"
root@localhost \~# echo $?
0
实践3-脚本实践
查看脚本内容
root@localhost \~# cat simple_login_string.sh
#!/bin/bash
功能: 模拟shell登录
版本:v0.1
作者:书记
联系:www.superopsmsb.com
定制命令变量
HOSTNAME=$(hostname)
清屏
clear
输出提示信息
echo "---------------------------------"
交互输入登陆信息
read -p "请输入用户名:" account
-z $account && read -p "请输入用户名:" account
read -s -t30 -p "请输入登录密码:" password
echo
echo "---------------------------------"
输出用户输入信息
$account == 'root' && $password == '123456' && echo "登录成功" || echo "登录失败"
脚本执行测试root@localhost \~# /bin/bash simple_login_string.sh
请输入用户名:root
请输入登录密码:
登录成功
root@localhost \~# /bin/bash simple_login_string.sh
CentOS Linux release 7.9.2009 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64
请输入用户名:
请输入用户名:root1
请输入登录密码:
登录失败
root@localhost \~#****