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

如何在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 # False1 R' ?: l# m/ w, e; B
jobdone=1 # True
, q: _1 h: m  }% {! o4 @## 更具可读性的语法 ##
: Y' w  `7 A- d) Xfailed=false! A/ ~* ^2 |: x) Y. G
jobdone=true
现在,当$failed是数字(例如0或1)时,我们可以按以下方式检查它:if [ $failed -eq 1 ]
9 j, \# [* v# J& F( e  Ithen
( k' S* b0 b; J. v, @    echo "Job failed". m* k- \( D) \- D$ r. Q6 d+ C
else
7 M. \0 n1 H7 K: T1 }/ U+ [- e    echo "Job done"+ X& n/ u9 k" N- J+ V/ K# ^0 ^' G. h) b* ~- m
fi
/ ~/ f4 w& x8 W# |7 [
就这样。
如何在Shell脚本中声明和使用布尔变量(例如“ true”和“ false”)
当然,我们可以将它们定义为字符串,并使我们的代码更具可读性:
#!/bin/bash
% k# P' Y1 K9 T1 s6 t8 J( {6 L# Declare it as string
- H8 x% f( P' L7 ]( Wfailed="false" 9 y$ v& G! j( B* ?) u
1 O3 ]/ o# _% r
if [ "$failed" == "true" ]! t# |3 x, f. Y4 L8 p
then% t& _8 F8 \" O; q9 Q
    echo "Job failed"3 r1 d. |2 \: F, F3 q+ z; y* B
else7 E1 {* T, C+ o) H( S5 H
    echo "Job done"$ K7 ]: V9 W0 i) X  t8 b# a6 h
fi
或者
# set it to true
. m* Q2 q2 |' remail_sent=true
) R, K0 e3 X3 I+ w# ...do your stuff and flip email_sent to 'false' if needed ...$ ?0 w' k/ q6 l, @( l
if [ "$email_sent" = true ]
* o! r0 f" d$ ~1 _# Zthen
6 R% K' h0 n( p    echo 'Data logged and email sent too.'  Z. ^6 c8 A! @) I& x! d
else
. S& Z3 o7 M" j) w    echo 'ALERT: Operation failed.'
8 D2 I5 E: ~7 }" R' u. D    logger 'ALERT: Operation failed.'+ T; D' a3 f7 J% |7 `3 h: X/ N
fi7 [& M; R  ~5 T( s
9 ~9 A" K9 i# D5 s1 u, `# Y; I
在bash下定义布尔变量的替代语法如下:

4 d7 q% |2 M3 b$ |% r
# Let us Declare Two Boolean Variables1 M! H! p; B5 J2 i# ?7 K. C. G9 x
# Set this one to true
/ a3 w% l4 l2 J, w, Sjobstatus=true5 Z+ }+ V7 v6 w4 N8 J! n
# Check it
% `' r# h; t# y: sif [ "$jobstatus" = true ] ; then- X8 J+ X1 z/ h1 Y
echo 'Okay '
: j' U% j" N$ d' z# S7 C8 ?else- n4 Y0 r1 ~1 x' y& g( m
echo 'Noop '8 t; R% B7 X: \/ O# M* \) V# a
fi. e1 S& \, q& b* @
# Double bracket format syntax to test Boolean variables in bash
" A5 v$ }  g2 R: Cbool=false
! L  p# Z/ h7 d6 |+ ~* U; z6 B$ sif [[ "$bool" = true ]] ; then
) G. D- k# t$ f$ o/ \echo 'Done.'1 D! U4 Z; n. j+ v1 R& X* Y0 ~
else
8 T9 n+ ^9 D+ o9 I. ?! `( secho 'Failed.'
# k! x* {* F5 b! D" U7 xfi
$ t7 W; J2 G8 D# V

" n# M5 e! V# G, \0 r8 L9 l
让我们对其进行测试: 微信图片_20210104141214.png shell脚本示例中的Bash布尔变量下面是一个示例脚本:
% ^# m) s2 l& I: h$ v
#!/bin/bash
' I9 j, p+ K- |6 H( \# Purpose: Backup stuff from /data/apps
0 r6 t+ T% X1 T; ?; Q# Tested on : AWS EC2 with EFS and Ubuntu 20.04 Pro servers
# }7 r9 E7 O1 F& q* o) u& O7 M9 h# ---------------------------------------------------------
8 v* u! x+ n4 g: ?source "/apps/.keychain/$HOSTNAME-sh"4 Q% Z) |/ D+ c8 i8 G& {
source "/apps/scripts/cli_app.sh"
8 x( q7 E* N1 \2 b6 }- H$ k+ }0 D6 X# K- f4 u% q1 |- l; L2 ]
# Set failed to 'False'
. `. n& Q9 U/ zfailed=0
. |- G& P8 {# O, A- {, U$ D* @1 k1 M% P, P+ J
D="/nfsefs/ec2mum/prodwwwroot", ^- }( b4 C  y( m0 L
log="/tmp/server.log.$$.txt"
0 K1 l3 n% J0 n( e% C/ U, ]" Q+ Q5 z$ y  o) m
# Log everything to our file
0 X$ O0 M+ B. [exec 3>&1 4>&25 m+ p) S! T" g( ]8 O
trap 'exec 2>&4 1>&3' 0 1 2 3% P. l5 H0 Q% U, ~3 c" I- A
exec 1>"${log}" 2>&1
9 |1 ^4 w2 \2 V- k
4 Y( ]) I$ [5 v& l: Q# Backup all web servers
0 v( E! W, |$ t% E8 w2 W) jfor s in www-0{1..8}
9 s0 m6 K+ T) ]6 [" @do$ M/ n6 [& j$ J& Y1 b4 ]: s
        /usr/bin/rsync -az --delete backupt@${s}:/data/apps/ ${D}/${s}/6 g, C- Q' s3 n# M' a( ]5 d# |) R
        # set to 'true' when rsync failed and continue loop  $ n/ m! }& d! X0 O
        [ $? -ne 0 ] && failed=1
: s0 g+ I3 B/ J& E$ ~done6 m/ o, [9 r2 m% J. n! i

: D1 B( F! i9 p* ?# See if rsync failed in loop ( _  {# G/ n1 _4 ^. ~
if [ $failed -eq 1 ]
6 G$ o; n5 \1 v. t$ g9 ^2 uthen
% }( h7 \( T5 R# ?/ H        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
7 X2 p1 K$ u! k7 x        push_to_mobile "$0" "Dear sysadmin,
0 z% C: c' L/ |7 d
9 @. l: y6 r) T/ R( m& w1 J        Backup failed at $HOSTNAME at $(date).
' K+ D/ o3 H+ S/ Q2 v0 u8 v; j( y' _
        ---- log:start ---* l  f( e4 Z( l

6 e) ^4 I9 e$ i/ D4 u, v        $(<${log})' X  m  E' s( Q: \' c0 X
+ Y0 P- A2 e/ P2 n$ K
        --- log:end --9 x3 _+ F9 F+ m+ ~

  j0 p- C+ d# \, b9 C        -- ' ?& u( ]$ r  \! J- s2 i1 q0 P) i
        Yours faithfully,6 }/ a) |2 n! N# O) m
        $0"2 U$ r' n# K, `" O2 y
fi
" Z0 b3 y2 c0 d" N[ -f "${log}" ] && rm -f "${log}", T% s5 Q+ X& n- Q0 e
+ A; s4 s' B( Q; T
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报告错误),那么通过电子邮件/文本消息通知系统管理员或开发人员:

# S& x6 z- v+ }3 \* {
if [ $status -ne 0 ] ||  [ "$alogs" != "" ]; then
& O; n- ]. R0 d, f! `        sub="Backup job failed at $HOSTNAME"
/ o" m0 i1 C' l* G  i0 ~9 b        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"
! n* d4 B3 |+ v        push_to_mobile "$0" "$sub6 ]$ z6 p& }& v, p) B* a: ^& Y5 K
1 T. ^& a/ z+ W5 `1 l" j& t8 n
        $0 script ended with errors when we ran /usr/bin/rsnapshot \"$1\". u* k" B7 ^4 ~' t" b; |
) V! T, f, F6 s1 m4 z/ y
        $alogs3 ?, w% ?2 w, U5 H, |' G# U, P
9 s# \& h: {9 ~! i# I& A( k0 w& I
        See email for detailed log."* g) }1 `9 N3 P( v  L- R, G
. v* h& |6 g, E, C7 ~" @
else5 i! [% \3 c) w0 T
        sub="Backup successful at $HOSTNAME"% a6 a2 J, b9 {- @! j- [
        #push_to_mobile "$0" "$sub. See email for detailed backup log." >/dev/null- O% Q% o3 I# k
        #mail -A "$log" -s "$sub" -r sys@somewhere-tld sysadmin@gmail-tld <<< "$0 /usr/bin/rsnapshot ran successfully\"$1\" $alogs"
1 K1 l& u7 t3 K- X7 \9 k! ?fi
; f" q+ H7 T/ _# G
4 y% f( O' m- ?( ^+ V
最后,删除$log文件:[ -f "$log" ] && rm -f "$log"总结本文我们讲解了如何在Linux或类Unix系统的shell脚本/bash中声明和使用布尔变量。使用man命令查看以下手册页:$ man bash
0 u' y: s) i) `! `; `; O  Y# t$ help test
, b4 ?) W% m! H) Z1 h- @$ help if
  H- w+ E- T( X4 M$ B7 |: b5 n
赞 收藏 评论0 发布时间:2021-1-4 14:12

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版