导读 本文讲述了在 Bash 脚本中处理错误的一些技巧,如何获取错误代码、在执行脚本时获得详细输出、处理调试功能和错误重定向。使用这些技巧,系统管理员可以使他们的日常工作变得轻松。

退出状态

在 Bash 脚本中,$?将打印退出状态。如果返回零,则表示没有错误。如果不为零,结论就是任务可能存在一些问题。

如下是一个简单例子:

[root@localhost ~]# cat myscript.sh
#!/bin/bash
mkdir learning
echo $?

如果运行上述脚本一次,它将打印 0,因为该目录不存在,因此脚本将创建它。如果第二次运行该脚本,将获得一个非零值,如下所示:

[root@localhost ~]# sh myscript.sh
0
[root@localhost ~]# sh myscript.sh
mkdir: cannot create directory ‘learning’: File exists
1

最佳实践

建议通过将 set -x 命令添加到 shell 脚本来启用调试模式,如下所示:

[root@localhost ~]# cat test3.sh
#!/bin/bash
set -x
echo "Hello World!"
mkdiir testing

然后运行脚本查看:

[root@localhost ~]# sh test3.sh
+ echo 'Hello World!'
Hello World!
+ mkdiir testing
test3.sh: line 4: mkdiir: command not found


可以编写如下调试函数,这有助于随时调用它,使用以下示例:

[root@localhost ~]# cat debug.sh
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@
}
DEBUG echo 'Testing Debugging'
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x

输出内容如下:

[root@localhost ~]# sh debug.sh
Testing Debugging
+ a=2
+ b=3
+ c=5
+ DEBUG set +x
+ '[' on == on ']'
+ set +x
2 + 3 = 5

错误重定向

可以使用标准错误输出将所有系统错误重定向到自定义文件,标准错误可以用数字 2 表示。在 Bash shell 执行它,如下所示:

[root@localhost ~]# mkdir users 2> errors.txt
[root@localhost ~]# cat errors.txt
mkdir: cannot create directory ‘users’: File exists


大多数时候,很难在脚本中找到确切的行号。要打印带有错误的行号,请使用 PS4 选项,其中的$LINENO是预定义好的变量。

[root@localhost ~]# cat test3.sh
#!/bin/bash
PS4='$LINENO: 'set -x
echo "Hello World!"
mkdiir testing

可以在阅读错误时轻松查看行号:

[root@localhost ~]# sh test3.sh
5: echo 'Hello World!'
Hello World!
6: mkdiir testing
test3.sh: line 6: mkdiir: command not found

总结

本文讲述了在 Bash 脚本中处理错误的一些技巧,如何获取错误代码、在执行脚本时获得详细输出、处理调试功能和错误重定向。使用这些技巧,系统管理员可以使他们的日常工作变得轻松。

Bash 脚本中的错误处理相关推荐

  1. bash脚本中出现[[:not found错误的解决方法

    bash脚本中出现[[:not found错误的解决方法--bash脚本总结1 今天在写脚本的时候,发生了一个奇怪的问题:在脚本中使用[[的时候报错"[[: not found". ...

  2. 第四组视频:在bash脚本中使用脚本选项

    马哥教育(http://www.magedu.com)在bash脚本中使用脚本选项.本视频是我们上课过程的实际记录.下载地址:    http://down.51cto.com/data/414002 ...

  3. 如何在bash脚本中提示用户进行确认? [重复]

    本文翻译自:How do I prompt a user for confirmation in bash script? [duplicate] This question already has ...

  4. 如何从Bash脚本中检测操作系统?

    我想将.bashrc和.bash_login文件保存在版本控制中,以便我可以在我使用的所有计算机之间使用它们. 问题是我有一些操作系统特定的别名,所以我一直在寻找一种方法来确定脚本是否在Mac OS ...

  5. linux脚本里用expect,如何在bash脚本中使用expect

    这是我在 following bash脚本中使用的代码片段: for user_input in `awk '{print}' testfile_$$.txt` do ipaddress=`echo ...

  6. linux sftp账号密码脚本传文件,关于shell:如何使用Bash脚本中的密码运行sftp命令?...

    我需要从Linux主机使用sftp将日志文件传输到远程主机.我的操作组已为我提供了相同的凭据.但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享. 那么,有没有一种方法可以通过cro ...

  7. 处理除第一个之外的所有参数(在bash脚本中)

    本文翻译自:Process all arguments except the first one (in a bash script) I have a simple script where the ...

  8. 《R语言初学指南》一2.3 找到R脚本中的错误

    本节书摘来自异步社区<R语言初学指南>一书中的第2章,第2.3节,作者[美]Brian Dennis(布莱恩·丹尼斯),更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  9. java中bash应用_在bash脚本中查找java应用程序的进程ID(以查看目标应用程序是否已在运行)...

    我知道获取进程ID有一百万个问题,但这个问题似乎是独一无二的.谷歌没有给我答案,所以我希望stackexhange会帮助而不是关闭这个问题. 当涉及Java时,找到进程ID似乎比较棘手(pgrep不起 ...

最新文章

  1. 「倚天」一出,谁与争锋!全球首款5nm服务器芯片,业界最强
  2. confluence安装_Hive安装
  3. 来自未来团队伙伴的一封信
  4. C#比較对象的相等性
  5. xmlhttprequest level 2
  6. 003-JavaString数据类型
  7. Android学习笔记——Handler(二)
  8. 多目标跟踪——MOT算法的学习笔记
  9. 苹果:两个 M1 Max 拼一块儿,“史上最强 PC 芯片”M1 Ultra 就出来了!
  10. 这一次,我们“抓住了” 100 万个程序员!
  11. 《剑指Offer》题目:合并两个排序的链表
  12. Evernote 全球开发者大赛最终入围作品介绍
  13. [bzoj4025] 二分图
  14. size()计算jquery对象中元素的个数
  15. 利用matlab求解二维水动力,[转载]MIKE系列软件之二维河口与海岸模拟软件MIKE 21...
  16. 全面系统学习机房精密空调设计、选型、安装、维保
  17. elasticsearch小记之—— unmapped_type的使用
  18. 迅雷离线下载 linux,linux 下使用迅雷离线下载
  19. 2014年大数据解决方案提供商面临三大挑战
  20. SSDAlloc:用 SSD 扩展内存

热门文章

  1. JavaScript高级程序设计(反刍) 11
  2. 武汉大学计算机假期有什么活动,【新生福利】武大有哪些好玩的大型活动?
  3. 央行调节市场三大法宝
  4. C++翻译A1042 Shuffling题解
  5. Unity笔记之zSpace开发
  6. 中国 地球科学相关数据共享平台 汇总(持续更新)
  7. 美股量化交易的优势有哪些?
  8. 快速更换纯色背景的颜色
  9. 共享打印机显示服务器错误代码,使用共享打印机 出现错误代码0x00000709的解决办法...
  10. 家居建材供应链模式盘点,数商云供应链SCM系统助力企业做好采购计划管理