gpt4 book ai didi

bash - 检查命令错误是否包含子字符串

转载 作者:行者123 更新时间:2023-11-29 09:03:30 25 4
gpt4 key购买 nike

我有很多 bash 命令。其中一些由于不同原因而失败。我想检查我的一些错误是否包含子字符串。

这是一个例子:

#!/bin/bash

if [[ $(cp nosuchfile /foobar) =~ "No such file" ]]; then
echo "File does not exist. Please check your files and try again."
else
echo "No match"
fi

当我运行它时,错误被打印到屏幕上并且我得到“不匹配”:

$ ./myscript
cp: cannot stat 'nosuchfile': No such file or directory
No match

相反,我希望捕获错误并匹配我的条件:

$ ./myscript
File does not exist. Please check your files and try again.

如何正确匹配错误信息?

附言我找到了一些解决方案,您对此有何看法?

out=`cp file1 file2 2>&1`
if [[ $out =~ "No such file" ]]; then
echo "File does not exist. Please check your files and try again."
elif [[ $out =~ "omitting directory" ]]; then
echo "You have specified a directory instead of a file"
fi

最佳答案

我会这样做

# Make sure we always get error messages in the same language
# regardless of what the user has specified.
export LC_ALL=C

case $(cp file1 file2 2>&1) in
#or use backticks; double quoting the case argument is not necessary
#but you can do it if you wish
#(it won't get split or glob-expanded in either case)
*"No such file"*)
echo >&2 "File does not exist. Please check your files and try again."
;;
*"omitting directory"*)
echo >&2 "You have specified a directory instead of a file"
;;
esac

这也适用于任何 POSIX shell,如果您决定这样做,它可能会派上用场将您的 bash 脚本转换为 POSIX shell(dashbash 快很多)。

您需要第一个 2>&1 重定向,因为可执行文件通常将主要不用于进一步机器处理的信息输出到 stderr。您应该>&2 重定向与echo 一起使用,因为您在那里输出的内容符合该类别。

关于bash - 检查命令错误是否包含子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45404626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com