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

相关推荐
寻月隐君14 分钟前
Rust + Protobuf:从零打造高效键值存储项目
后端·rust·github
welsonx16 分钟前
Android性能优化-Frida工具篇
java
qianmoQ18 分钟前
GitHub 趋势日报 (2025年06月07日)
github
圈圈编码22 分钟前
LeetCode Hot100刷题——合并两个有序链表
java·数据结构·算法·leetcode·链表
小前端大牛马28 分钟前
java教程笔记(十四)-线程池
java·笔记·python
魔镜魔镜_谁是世界上最漂亮的小仙女33 分钟前
java-maven依赖管理
java·后端·全栈
Kim Jackson36 分钟前
我的世界Java版1.21.4的Fabric模组开发教程(十三)自定义方块状态
java·游戏·fabric
异常君40 分钟前
Java 双冒号(::)操作符实战解析与类型推断机制
java·代码规范·函数式编程
AA-代码批发V哥42 分钟前
Java多线程实现之Thread类深度解析
java
快乐肚皮1 小时前
Spring Framework 6:核心升级特性
java·spring