应该注意的是,if...then...fi
和&&
/ ||
方法的类型涉及我们要测试的命令返回的退出状态(成功时为0);但是,如果命令失败或无法处理输入,则某些命令不会返回非零退出状态。这意味着通常的if
和&&
/ ||
方法对那些特定命令不起作用。
例如,在Linux上file
,如果GNU 接收到不存在的文件作为参数并且find
无法找到指定的文件用户,则GNU 仍将以0退出。
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
在这种情况下,我们可能会处理这种情况的一种可能方式是读取stderr
/ stdin
消息,例如,由file
命令返回的消息,或解析命令的输出,例如in find
。为此,case
可以使用语句。
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
(这是我对unix.stackexchange.com有关问题的回答的转贴)