Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux教程 - 在Shell脚本中声明和使用布尔变量示例

Linux教程 - 在Shell脚本中声明和使用布尔变量示例

作者头像
用户6543014
发布于 2021-01-07 11:04:32
发布于 2021-01-07 11:04:32
18.8K00
代码可运行
举报
文章被收录于专栏:CU技术社区CU技术社区
运行总次数:0
代码可运行

作者:Linux迷链接:https://www.linuxmi.com/shell-boolean-variables.html

需要定义一个名为failed的bash变量,并将值设置为False。当从cron作业调用我们的脚本时,特定的任务可能会失败,然后我需要将failed转换为True。基于$failed,我需要发送一封电子邮件警告我的cron作业失败了。那么,如何在Linux服务器上运行的shell脚本中声明和使用布尔变量呢?

Bash中没有布尔值。但是,我们可以根据需要将shell变量的值定义为0(“False”)或1(“True”)。不过,Bash也支持布尔表达式条件。让我们看看如何在Bash中组合这两个概念来声明布尔变量,并在运行在Linux、macOS、FreeBSD或类unix系统上的shell脚本中使用它们。

在bash中声明布尔变量

语法如下,定义如下内容

failed=0 # False jobdone=1 # True ## 更具可读性的语法 ## failed=false jobdone=true

现在,当$failed是数字(例如0或1)时,我们可以按以下方式检查它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if [ $failed -eq 1 ]
then
    echo "Job failed"
else
    echo "Job done"
fi

就这样。

如何在Shell脚本中声明和使用布尔变量(例如“ true”和“ false”)

当然,我们可以将它们定义为字符串,并使我们的代码更具可读性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
# Declare it as string 
failed="false" 

if [ "$failed" == "true" ]
then
    echo "Job failed"
else
    echo "Job done"
fi

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# set it to true
email_sent=true
# ...do your stuff and flip email_sent to 'false' if needed ...
if [ "$email_sent" = true ] 
then
    echo 'Data logged and email sent too.'
else
    echo 'ALERT: Operation failed.'
    logger 'ALERT: Operation failed.'
fi

在bash下定义布尔变量的替代语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Let us Declare Two Boolean Variables
# Set this one to true
jobstatus=true
# Check it 
if [ "$jobstatus" = true ] ; then
echo 'Okay :)'
else
echo 'Noop :('
fi
# Double bracket format syntax to test Boolean variables in bash
bool=false
if [[ "$bool" = true ]] ; then
echo 'Done.'
else
echo 'Failed.'
fi

让我们对其进行测试:

shell脚本示例中的Bash布尔变量

下面是一个示例脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
# Purpose: Backup stuff from /data/apps
# Tested on : AWS EC2 with EFS and Ubuntu 20.04 Pro servers
# ---------------------------------------------------------
source "/apps/.keychain/$HOSTNAME-sh"
source "/apps/scripts/cli_app.sh"

# Set failed to 'False' 
failed=0 

D="/nfsefs/ec2mum/prodwwwroot"
log="/tmp/server.log.$$.txt"

# Log everything to our file
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>"${log}" 2>&1

# Backup all web servers
for s in www-0{1..8}
do
        /usr/bin/rsync -az --delete backupt@${s}:/data/apps/ ${D}/${s}/
        # set to 'true' when rsync failed and continue loop  
        [ $? -ne 0 ] && failed=1
done

# See if rsync failed in loop 
if [ $failed -eq 1 ]
then
        echo "$0 script error: rsync backup failed. See attached log file." | mail -A ${log} -s "$HOSTNAME - LXD backup failed" -r sysuser@my-corp-tld alert@somewhere-tld
        push_to_mobile "$0" "Dear sysadmin,

        Backup failed at $HOSTNAME at $(date). 

        ---- log:start ---

        $(<${log})

        --- log:end --

        -- 
        Yours faithfully,
        $0"
fi
[ -f "${log}" ] && rm -f "${log}"

Bash布尔测试

首先,定义一个日志文件

log="/tmp/rsnapshot.$$.txt"

让我们运行rsnapshot命令:

/usr/bin/rsnapshot "$1" 2>&1 | $HOME/bin/error-scanner.pl > "${log}"

在$status中获取bash命令的退出状态,如下所示:

status=$?

接下来在我们的$log文件中搜索ERROR:

alogs="$(egrep -w '^ERROR:|ERROR' $log)"

如果$status不为零(命令失败)或$alogs不为空(由$HOME/bin/error-scanner.pl报告错误),那么通过电子邮件/文本消息通知系统管理员或开发人员:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if [ $status -ne 0 ] ||  [ "$alogs" != "" ]; then
        sub="Backup job failed at $HOSTNAME"
        mail -A "$log" -s "$sub" -r sys@somewhere-tld sysadmin@gmail-tld <<< "$0 script ended with errors when we ran /usr/bin/rsnapshot \"$1\" $alogs"
        push_to_mobile "$0" "$sub

        $0 script ended with errors when we ran /usr/bin/rsnapshot \"$1\"

        $alogs

        See email for detailed log."

else
        sub="Backup successful at $HOSTNAME"
        #push_to_mobile "$0" "$sub. See email for detailed backup log." >/dev/null
        #mail -A "$log" -s "$sub" -r sys@somewhere-tld sysadmin@gmail-tld <<< "$0 /usr/bin/rsnapshot ran successfully\"$1\" $alogs"
fi

最后,删除$log文件:

[ -f "$log" ] && rm -f "$log"

总结

本文我们讲解了如何在Linux或类Unix系统的shell脚本/bash中声明和使用布尔变量。使用man命令查看以下手册页:

$ man bash $ help test $ help if

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SACC开源架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
101个shell脚本
emm。。这个脚本是因为tomcat没有自带的能够给service开机启动的脚本,我就琢磨着自己写了一个简单的启动脚本,如下:
端碗吹水
2020/09/23
1.4K0
101个shell脚本
Linux服务器超级实用的Shell脚本,建议收藏!
用户5921339
2025/05/20
1630
Linux服务器超级实用的Shell脚本,建议收藏!
Linux系统——shell脚本编程基础介绍
它是一个命令解释器,在linux/unix操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种操作输出的结果,输出到屏幕返回给用户,可以是交互式与非交互式的方式进行会话
民工哥
2020/09/16
2.2K0
十个增加 Linux Shell 脚本趣味的小工具
很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。
Debian中国
2018/12/21
1.2K0
Linux Shell脚本之GitLab远程备份
注:Gitlab是一个Git服务程序,有Web图形界面和一系列管理工具,具体详细介绍可以Google it。
知忆
2021/06/09
1.1K0
实现Shell脚本自动备份Gitlab档案并同步到远程
本文介绍了如何通过GitLab实现本地和远程GitLab的定时备份,并发送邮件提醒。主要包含以下步骤:1. 在GitLab中配置SSH密钥认证,并开启SSH服务;2. 使用crontab定时任务实现每天凌晨2点自动备份GitLab到远程服务器;3. 通过邮件发送备份结果。
shaonbean
2018/01/02
2.3K0
Linux Shell脚本经典案例
10.并发从数台机器中获取 hostname,并记录返回信息花 费的时长,重定向到一个文件 hostname.txt 中,在全部 完成后输出花费时长最短的那台机器的 CPU 信息。
用户7741497
2022/03/24
9700
shigen的一些shell脚本分享
希望以上shigen积累和用到的脚本能给大家带来帮助,当然只是一部分,还有其他的很多效率脚本来不及整理和分享。正如我的一个运维伙伴所说:具体的脚本还得看业务情况。
shigen
2023/11/07
2600
shigen的一些shell脚本分享
Linux 【Shell脚本经典案例】
===============Talk is cheap, show me the code,bye-bye================
IT茂茂
2020/09/17
3.4K0
Linux 【Shell脚本经典案例】
Linux运维常用shell脚本之文件和字符串管理实例
编写shell脚本,将/usr/local/test目录下大于100k的文件转移到/tmp目录下:
菲宇
2022/12/02
5750
shell脚本的函数介绍和使用案例
#前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同
老油条IT记
2020/04/01
1.7K0
shell脚本的函数介绍和使用案例
shell脚本编程之路3
描述:Bash(Bourne Again shell)也跟其他编程语言一样也支持函数,一般在编写大型脚本中需要用到,函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高,像其他编程语言一样,Shell 也支持函数。但是bash作为一种解释性语言,bash 在编程能力方面提供的支持并不像其他编译性的语言(例如 C 语言)那样完善,执行效率也会低很多。
全栈工程师修炼指南
2022/09/28
3.4K0
shell脚本编程之路3
linux 下RMAN备份shell脚本
       RMAN备份对于Oracle数据库的备份与恢复简单易用,成本低廉。对于使用非catalog方式而言,将RMAN脚本嵌入到shell脚本,然后再通过crontab来实现中小型数据库数据库备份无疑是首选。本文提供了一个简单易用的基于linux shell下的RMAN备份脚本供参考。大家可根据自己的需要进行适当调整。
Leshami
2018/08/14
2.1K0
shell脚本实现GrayLog配置的定期备份
众所周知GrayLog的配置都保存在MongoDB数据库,这时我们只需备份GrayLog的MongoDB即可
yuanfan2012
2023/09/06
4030
shell脚本实现GrayLog配置的定期备份
Linux/Unix shell 自动导入Oracle数据库
      使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等。本文给出Linux 下使用 shell 脚本来实现自动导入Oracle数据库。
Leshami
2018/08/14
1.4K0
Linux Shell脚本面试25问
Q:1 Shell脚本是什么、它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(
小小科
2018/05/04
1.6K0
Linux Shell脚本案例
1.Dos攻击防范(自动屏蔽攻击IP) #!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/demo2.access.log ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}') for IP in $ABNORMAL_IP; do if [ $(iptabl
用户7741497
2022/03/01
1.4K0
shell脚本极简教程
一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工作效率。没有一个大公司不要求linux的基本技能的,只是不同岗位要求掌握的程度不同。 二,shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具
架构师小秘圈
2018/04/02
1.9K0
Shell脚本编程_shell简单脚本
  shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,在用户和内核之间充当翻译官的角色,是一个命令解释器。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 shell。
全栈程序员站长
2022/11/09
8.3K0
Shell脚本编程_shell简单脚本
实用Shell脚本
假设服务器为lnmp环境,近期访问经常出现502现象,且502错误在重启php-fpm服务后消失,因此编写监控脚本,一旦出现502,则自动重启php-
花落花相惜
2021/11/26
1.3K0
相关推荐
101个shell脚本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档