Linux 和 Unix 的 Bourne Shell 退出状态示例
每个 UNIX 命令在终止时都会返回一个状态。如果不成功,它会返回一个代码,告诉 shell 打印错误消息。您可以使用 ”exit”[ 命令
Bourne Shell 退出状态的典型值
- 0—成功。
- 1 – 内置命令失败。
- 2 – 发生语法错误。
- 3—接收到未被捕获的信号。
使用 Bourne shell 时如何打印退出状态?
键入命令。例如,ls 命令列出当前目录中的文件:
$ ls
要打印其退出状态,请键入 echo 命令或 printf 命令:
$ echo $?
或者
$ printf "%d\n" $?
尝试更多示例:
现在尝试正确的命令:
打印 date 命令的退出状态:
$ date1
$ echo $?
$ date
$ echo $?
示例
尝试以下示例并记下退出状态:
$ cat /etc/passwd
$ echo $?
$ grep vivek /etc/passwd
$ echo $?
Linux 或 Unix /bin/sh 退出代码教程(附示例)
如何在脚本中存储或使用退出代码
要将最后执行的命令的退出状态存储到名为 status 的 shell 变量中,请输入:
打印它:
您也可以将退出状态与 test 命令或 if 命令一起使用。例如:
$ command1
$ status=$?
$ echo "Exit status of 'command1' is $status"
#!/bin/sh user="$1" if grep "$user" /etc/passwd; then echo "$user has an account" else echo "$user doesn't have an account" fi
./script-name vivek
用作条件,但实际上可以是您选择的任何命令。如果它返回零退出状态,则条件为真;否则为假。在下面的示例中,只要条件为真,while 循环就会执行给定的命令。同样,条件可以是任何命令,如果命令以零退出状态退出,则为真。脚本:
while condition; do commands done
这是另一个简单的例子:
#!/bin/sh x=0 while [ $x != 3 ] do let x=x+1 echo "$x" done
下面是另一个示例脚本,它接受多个文件名作为命令行参数,并将每个文件的内容附加到名为“output”的输出文件中:
#!/bin/sh while [ -r "$1" ] do cat "$1" >> output shift done
运行如下:
shift 命令用于移动命令行参数,丢弃当前值 $1,并使下一个参数 $2 成为新的 $1。这允许循环按顺序处理作为参数传递的每个文件,直到没有更多参数为止。
$ ./script-name file1 file2 fil3
$ cat output
如何为自己的脚本设置退出代码值
要在脚本中设置退出代码,请使用:
$ exit N
$ exit 0
$ exit 999
exit 命令的 Shell 脚本示例
#!/bin/bash set -e VAULT_FILE="$1" # exit if file not found with exit code '1' if [ ! -f "${VAULT_FILE}" ] then echo "$0 - ${VAULT_FILE} file not found." exit 1 fi say "Enter primary password for ${VAULT_FILE}" _PASSWORDS=$(ansible-vault view "${VAULT_FILE}" 2>/dev/null | awk -F ': ' '{ print $2}') # exit with exit code 1 if password is not set aws cli if [ "${_PASSWORDS}" == "" ] then echo "$0 - ${VAULT_FILE} decryption failed. Try again." exit 1 fi set -- $_PASSWORDS export AWS_ACCESS_KEY_ID="$1" export AWS_SECRET_ACCESS_KEY="$2" say "*** Enter 2FA code now: ***" decrypt.key.sh sysadmin-aws-cli-example-projects > "$code_tmp_file" wait ... .. ......
例如:
#!/bin/bash set -e in="${1?:Must provide input file. Bye}" out="${2:-/tmp/out.gif}" png="$(mktemp --suffix=.png)" # exit with error code 1 if '$in' not found if [ ! -f "$in" ] then echo "Error: $in not found" exit 1 fi echo "Creating gif file using ffmpeg ..." ffmpeg -loglevel quiet -y -i "$in" -vf fps=15,scale=320:-1:flags=lanczos,palettegen "$png" ffmpeg -loglevel quiet -y -i "$in" -i "$png" -filter_complex "fps=15,scale=300:-1:flags=lanczos[x];[x][1:v]paletteuse" "$out" \ && echo -e "*** Wrote '$out' ***\n\n$(ls -lh "$out")\n"
结论
本页展示了如何在使用 Bourne shell (sh) 时获取命令的退出状态。您可以使用 man 命令或 help 命令阅读文档:
$ man bash
$ help exit
参见
更多信息请参阅:
- 命令的退出状态
- Bash 在 Linux/Unix 上获取命令的退出代码
- Bash 找出所有管道命令的退出代码
- GNU/bash 在线手册页在这里