你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何在Linux或类Unix系统的shell脚本/bash中声明和使用布尔变量

[复制链接]
gaosmile 发布时间:2021-1-4 14:12
需要定义一个名为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)时,我们可以按以下方式检查它:if [ $failed -eq 1 ]
then
    echo "Job failed"
else
    echo "Job done"
fi
就这样。
如何在Shell脚本中声明和使用布尔变量(例如“ true”和“ false”)
当然,我们可以将它们定义为字符串,并使我们的代码更具可读性:
#!/bin/bash
# Declare it as string
failed="false"

if [ "$failed" == "true" ]
then
    echo "Job failed"
else
    echo "Job done"
fi
或者
# 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下定义布尔变量的替代语法如下:

# 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

让我们对其进行测试: 微信图片_20210104141214.png shell脚本示例中的Bash布尔变量下面是一个示例脚本:

#!/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报告错误),那么通过电子邮件/文本消息通知系统管理员或开发人员:

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

收藏 评论0 发布时间:2021-1-4 14:12

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版