shell编程

表达式

简介:所谓的表达式,就是在场景需求的前提下,判断数据和运算符的操作是否满足需求。

语法格式

格式

真实值 操作符 真实值 比较运算符 预期值

示例

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 \~#****

相关推荐
不会就选b5 分钟前
Linux之socket编程(七)----序列化与反序列化(1)
java·linux·服务器
秋名RG8 分钟前
Java 工程师学习路线
java·学习方法
秋名RG12 分钟前
Java 基础语法
java·开发语言
java1234_小锋15 分钟前
MyBatis-Plus 3.5.15 已全面支持 Spring Boot 4.0 及 Jackson 3.0
java·spring boot·mybatis
隔窗听雨眠20 分钟前
活动中台系统慢SQL治理实践:从监控告警到性能优化的全链路方法论
sql·性能优化·github
2501_9378609423 分钟前
Java 文件操作与IO(下):字节流、字符流实战IO读写
java·开发语言·python
xixingzhe225 分钟前
spring boot项目接口访问慢问题解决方案
java·数据库·spring boot
MetaLite27 分钟前
SpringBoot整合FastJson2数据脱敏-接口日志与失败降级
java·spring boot·后端
驭渊的小故事36 分钟前
java抽奖项目-奖品上传中传递参数类型的错误
java·开发语言
段一凡-华北理工大学41 分钟前
高炉智能布料技术与炉料分布优化~系列文章03:布料矩阵解码:环位、角度、圈数与料流的量化控制
java·网络·人工智能·矩阵·高炉智能化·高炉布料矩阵优化·高炉智能布料技术