gpt4 book ai didi

linux - bash - 根据过程条件返回值

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:10 24 4
gpt4 key购买 nike

我偶然发现了一种基于变量有条件地返回值的令人困惑的方式。我想检查进程是否成功然后回显“进程成功”,但如果失败,我想检查具体的错误信息然后返回错误信息,

ERRMSG="$(cd /nonexist 2>&1)"
if [ $? -ne 0 ]
then
if [ -z "$ERRMSG|grep -o 'No such file or directory'|head -1" ]
then
echo "empty" >> $FQLOGNAME
else
echo $ERRMSG|grep -o 'No such file or directory'|head -1 >> $FQLOGNAME
fi
else
echo "success" >> $FQLOGNAME
fi

请指教,谢谢

最佳答案

您不需要使用 grep 来检查字符串是否包含子字符串。 Bash 中内置的模式匹配就足够了。这段代码应该做一些接近你想要的事情:

if ERRMSG=$(cd /nonexist 2>&1) ; then
echo 'process success'
elif [[ $ERRMSG == *'No such file or directory'* ]] ; then
echo 'No such file or directory'
else
echo 'empty'
fi >> "$FQLOGNAME"

参见 Conditional Constructs section of the Bash Reference Manual有关 [[...]] 的模式匹配功能的详细信息。

我保留了 ERRMSGFQLOGNAME 变量,但请注意最好避免使用 ALL_UPPERCASE 变量名称。它们有可能与环境变量或 Bash 内置变量发生冲突。参见 Correct Bash and shell script variable capitalization .

要在多行错误信息中查找一个模式定义的错误信息,并且只打印第一条,可以在[[.. .]]。为了提供一个具体示例,此代码假定错误消息由“ERROR”后跟一个或多个空格后跟一个十进制数组成:

# Example function for testing
function dostuff
{
printf 'Output line A\n'
printf 'Encountered ERROR 29\n' >&2
printf 'Output line B\n'
printf 'Encountered ERROR 105\n' >&2
printf 'Output line C\n'

return 1
}

# Regular expression matching an error string
readonly error_rx='ERROR +[0-9]+'

if ERRMSG=$(dostuff 2>&1) ; then
echo 'process success'
elif [[ $ERRMSG =~ $error_rx ]] ; then
printf '%s\n' "${BASH_REMATCH[0]}"
else
echo 'empty'
fi >> "$FQLOGNAME"

它将“ERROR 29”附加到日志文件。

有关 Bash 的内置正则表达式匹配的更多信息,请参阅 mklement0's answer to "How do I use a regex in a shell script?" .

关于linux - bash - 根据过程条件返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52365007/

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