|
需要定义一个名为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 ## 更具可读性的语法 ## failed=false! A/ ~* ^2 |: x) Y. G jobdone=true现在,当$failed是数字(例如0或1)时,我们可以按以下方式检查它:if [ $failed -eq 1 ] then echo "Job failed". m* k- \( D) \- D$ r. Q6 d+ C else echo "Job done"+ X& n/ u9 k" N- J+ V/ K# ^0 ^' G. h) b* ~- m fi 就这样。 如何在Shell脚本中声明和使用布尔变量(例如“ true”和“ false”) 当然,我们可以将它们定义为字符串,并使我们的代码更具可读性: #!/bin/bash# Declare it as string failed="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 trueemail_sent=true # ...do your stuff and flip email_sent to 'false' if needed ...$ ?0 w' k/ q6 l, @( l if [ "$email_sent" = true ] then echo 'Data logged and email sent too.' Z. ^6 c8 A! @) I& x! d else echo 'ALERT: Operation failed.' 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下定义布尔变量的替代语法如下:# Let us Declare Two Boolean Variables1 M! H! p; B5 J2 i# ?7 K. C. G9 x # Set this one to true jobstatus=true5 Z+ }+ V7 v6 w4 N8 J! n # Check it if [ "$jobstatus" = true ] ; then- X8 J+ X1 z/ h1 Y echo 'Okay 'else- n4 Y0 r1 ~1 x' y& g( m echo 'Noop '8 t; R% B7 X: \/ O# M* \) V# afi. e1 S& \, q& b* @ # Double bracket format syntax to test Boolean variables in bash bool=false if [[ "$bool" = true ]] ; then echo 'Done.'1 D! U4 Z; n. j+ v1 R& X* Y0 ~ else echo 'Failed.' fi
% ^# m) s2 l& I: h$ v #!/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"4 Q% Z) |/ D+ c8 i8 G& { source "/apps/scripts/cli_app.sh" # K- f4 u% q1 |- l; L2 ] # Set failed to 'False' failed=0 $ D* @1 k1 M% P, P+ J D="/nfsefs/ec2mum/prodwwwroot", ^- }( b4 C y( m0 L log="/tmp/server.log.$$.txt" , ]" Q+ Q5 z$ y o) m # Log everything to our file 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 # Backup all web servers for s in www-0{1..8} 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 done6 m/ o, [9 r2 m% J. n! i # See if rsync failed in loop ( _ {# G/ n1 _4 ^. ~ 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). 0 u8 v; j( y' _ ---- log:start ---* l f( e4 Z( l $(<${log})' X m E' s( Q: \' c0 X + Y0 P- A2 e/ P2 n$ K --- log:end --9 x3 _+ F9 F+ m+ ~ -- ' ?& 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 [ -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报告错误),那么通过电子邮件/文本消息通知系统管理员或开发人员: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" "$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" fi 4 y% f( O' m- ?( ^+ V 最后,删除$log文件:[ -f "$log" ] && rm -f "$log"总结本文我们讲解了如何在Linux或类Unix系统的shell脚本/bash中声明和使用布尔变量。使用man命令查看以下手册页:$ man bash$ help test $ help if H- w+ E- T( X4 M$ B7 |: b5 n |
微信公众号
手机版