Bash 脚本中的错误处理
导读 | 本文讲述了在 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 脚本中的错误处理相关推荐
- bash脚本中出现[[:not found错误的解决方法
bash脚本中出现[[:not found错误的解决方法--bash脚本总结1 今天在写脚本的时候,发生了一个奇怪的问题:在脚本中使用[[的时候报错"[[: not found". ...
- 第四组视频:在bash脚本中使用脚本选项
马哥教育(http://www.magedu.com)在bash脚本中使用脚本选项.本视频是我们上课过程的实际记录.下载地址: http://down.51cto.com/data/414002 ...
- 如何在bash脚本中提示用户进行确认? [重复]
本文翻译自:How do I prompt a user for confirmation in bash script? [duplicate] This question already has ...
- 如何从Bash脚本中检测操作系统?
我想将.bashrc和.bash_login文件保存在版本控制中,以便我可以在我使用的所有计算机之间使用它们. 问题是我有一些操作系统特定的别名,所以我一直在寻找一种方法来确定脚本是否在Mac OS ...
- linux脚本里用expect,如何在bash脚本中使用expect
这是我在 following bash脚本中使用的代码片段: for user_input in `awk '{print}' testfile_$$.txt` do ipaddress=`echo ...
- linux sftp账号密码脚本传文件,关于shell:如何使用Bash脚本中的密码运行sftp命令?...
我需要从Linux主机使用sftp将日志文件传输到远程主机.我的操作组已为我提供了相同的凭据.但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享. 那么,有没有一种方法可以通过cro ...
- 处理除第一个之外的所有参数(在bash脚本中)
本文翻译自:Process all arguments except the first one (in a bash script) I have a simple script where the ...
- 《R语言初学指南》一2.3 找到R脚本中的错误
本节书摘来自异步社区<R语言初学指南>一书中的第2章,第2.3节,作者[美]Brian Dennis(布莱恩·丹尼斯),更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- java中bash应用_在bash脚本中查找java应用程序的进程ID(以查看目标应用程序是否已在运行)...
我知道获取进程ID有一百万个问题,但这个问题似乎是独一无二的.谷歌没有给我答案,所以我希望stackexhange会帮助而不是关闭这个问题. 当涉及Java时,找到进程ID似乎比较棘手(pgrep不起 ...
最新文章
- 「倚天」一出,谁与争锋!全球首款5nm服务器芯片,业界最强
- confluence安装_Hive安装
- 来自未来团队伙伴的一封信
- C#比較对象的相等性
- xmlhttprequest level 2
- 003-JavaString数据类型
- Android学习笔记——Handler(二)
- 多目标跟踪——MOT算法的学习笔记
- 苹果:两个 M1 Max 拼一块儿,“史上最强 PC 芯片”M1 Ultra 就出来了!
- 这一次,我们“抓住了” 100 万个程序员!
- 《剑指Offer》题目:合并两个排序的链表
- Evernote 全球开发者大赛最终入围作品介绍
- [bzoj4025] 二分图
- size()计算jquery对象中元素的个数
- 利用matlab求解二维水动力,[转载]MIKE系列软件之二维河口与海岸模拟软件MIKE 21...
- 全面系统学习机房精密空调设计、选型、安装、维保
- elasticsearch小记之—— unmapped_type的使用
- 迅雷离线下载 linux,linux 下使用迅雷离线下载
- 2014年大数据解决方案提供商面临三大挑战
- SSDAlloc:用 SSD 扩展内存