Linux bash退出状态以及如何在bash中设置退出状态
时间:2020-01-09 10:41:14 来源:igfitidea点击:
您能解释一下bash退出状态代码吗?
如何在Linux Shell脚本中设置bash退出状态?
每个Linux或Unix命令正常或异常终止时都会返回一个状态。
您可以在shell程序脚本中使用退出状态的值来显示错误消息或运行命令。
例如,如果tar命令不成功,它将返回一个代码,该代码告诉Shell脚本向sysadmins发送电子邮件。
有关Linux bash shell退出状态代码的更多信息
- Shell脚本或用户执行的每个Linux或Unix命令都具有退出状态。
- 退出状态是整数。
- 出于bash shell的目的,成功执行了以零(0)退出状态退出的命令。
- 非零(1-255)退出状态表示失败。
- 如果找不到命令,则为执行该命令而创建的子进程将返回状态127。如果找到但不能执行该命令,则返回状态为126。
- 如果所有Bash内置程序成功,返回的退出状态为零,失败时返回的状态为非零。
如何显示shell命令的退出状态?
您可以使用特殊的shell变量$来获取先前执行的命令的退出状态。
要打印$?
变量,请使用echo命令/printf命令。
语法为:
command echo $?
或者
/path/to/script.sh command date echo $? ## OR use the printf command ## printf "%d\n" $? ## run non-existence command ## foobar13535 ## display status code ## echo $?
如何将命令的退出状态存储在shell变量中
分配$?到一个shell变量。
语法为:
date status=$? echo "The date command exit status : ${status}"
Linux退出状态和条件/列表构造
一个简单的Shell脚本来查找主机名(findhost.sh)
#!/bin/bash # set var FILE="/etc/hosts" # get host name read -p "Enter a hostname : " hostname # try to locate hostname/computer name in $FILE grep -q -w "${hostname}" "${FILE}" # store exit status of grep # if found grep will return 0 exit status # if not found, grep will return a nonzero exit status status=$? if test $status -eq 0 then echo "Host '$hostname' found in $FILE file." else echo "Host '$hostname' not found in $FILE file." fi
如何使用&&和||退出代码的操作员
语法为:
command && echo "success" command || echo "failed" command && echo "success" || echo "failed"
如果找不到名为/tmp/foo的目录,请创建它:
[ ! -d "/tmp/foo" ] && mkdir -p "/tmp/foo"
例如,当未将文件名作为命令行arg传递时,显示用法语法:
#!/bin/Bash _files="$@" ## fail safe ## [[ "$_files" == "" ]] && { echo "Usage:#!/bin/bash set -e I=~/bin/tags.deleted.410 O="/tmp/https.www.theitroad.local.410.url.conf" t="" [ ! -f "$I" ] && { echo "$I file not found."; exit 10; } [ "$t" == "" ] && { echo "Usage:file1.png file2.png"; exit 1; } ## continue below ##perror 0 perror 1number-of-urls-to-purge-from-$I"; exit 11; } >$O cat "$I" | sort | uniq | while read -r u do uu="${u##https://www.theitroad.local}" echo "~^$uu 1;" >>"${O}" done echo "* Config file created at ${O} ..." echo "* Installing ${O} file on utls-wp-mg-www ..." ~/bin/install.py "${O}" echo "* Send config to rest of cluster nodes ... " ~/bin/install.py --sync --cluster --reload cbz-www echo "* Building list purge urls for Cloudflare CDN ..." sleep 1 url="" while IFS= read -r u do url="$url $u" done <<<"$(tail -${t} ${I})" [ "$url" != "" ] && ~/bin/cloudflare.purge.urls.sh "$url" [ -f "$O" ] && rm -f "$O"
这是另一个显示用法的shell脚本:
##代码##GNU/Linux的常见退出代码列表
退出代码 | 说明 |
---|---|
0 | 成功 |
1 | 不允许操作 |
2 | 没有这样的文件或目录 |
3 | 没有这样的过程 |
4 | 系统调用中断 |
5 | 输入/输出错误 |
6 | 没有此类设备或地址 |
7 | 参数列表太长 |
8 | Exec格式错误 |
9 | 错误的文件描述符 |
10 | 无子进程 |
11 | 资源暂时不可用 |
12 | 无法分配内存 |
13 | 权限被拒绝 |
14 | 地址错误 |
15 | 需要阻止装置 |
16 | 设备或资源繁忙 |
17 | 文件存在 |
18 | 无效的跨设备链接 |
19 | 没有这样的设备 |
20 | 不是目录 |
21 | 是目录 |
22 | 无效的参数 |
23 | 系统中打开的文件过多 |
24 | 打开的文件过多 |
25 | 设备不适当的ioctl |
26 | 文本文件忙 |
perror命令说明错误代码,它是MySQL/MariaDB软件包的一部分:
##代码##