首页 > 解决方案 > 如何在字符串中捕获返回码并重新运行

问题描述

所以我的问题是我试图弄清楚如何从我发布的命令中读取输出。

因此,输出粘贴了一个显示导入结果的文本块,并且在文本中它还显示退出代码 = 0(如果它有效)或退出代码 = 255(如果它没有)。所以我希望字符串从文本中获取退出代码,然后根据错误代码,它应该重新运行命令并重试三次,或者如果它已经工作则退出程序。

#!/bin/bash
#
i="0"
while [ $i -ne 3 ]
do

    string1=$(sudo -u nginx php /var/www/html/shell/global/full_import.php --import finance_backup)
    string2=$(sudo -u nginx php /var/www/html/shell/global/full_import.php --import finance_deactivate_quotes)
    string3=$(sudo -u nginx php /var/www/html/shell/global/full_import.php --import finance)

    if [ "$string1" == "code = 255" ] || [ "$string2" == "code = 255" ] || [ "$string3" == "code = 255" ]
then

    sudo -u nginx php /var/www/html/shell/global/full_import.php --import finance_backup
    sudo -u nginx php /var/www/html/shell/global/full_import.php --import finance_deactivate_quotes
    sudo -u nginx php /var/www/html/shell/full_import.php --import finance
    ((i++))
    sleep 3s
    echo it works
fi
string3="exit code = 0"
echo It works
done

标签: linuxbash

解决方案


提取文本

您可以使用它grep -o来提取字符串的一部分。如果您不关心提取的字符串,而只关心是否找到该字符串,您可以使用grep -q

import() {
    sudo -u nginx php /var/www/html/shell/global/full_import.php --import "$@"
}

exitCodeIs0() {
    grep -qF 'exit code = 0' <<< "$*"
}

for i in {1..3}; do
    echo "Importing..."
    output1=$(import finance_backup)
    output2=$(import finance_deactivate_quotes)
    output3=$(import finance)
    if exitCodeIs0 "$output1" && exitCodeIs0 "$output2" && exitCodeIs0 "$output3"; then
        echo "Success."
        break
    fi
    echo "Error."
done

这不会打印nginx命令的输出。如果要查看输出,请printf %s\\n "$output1" "$output2" "$output3"if.

使用真正的退出代码

如果退出代码只以文本形式返回,那就太奇怪了。您很可能可以(并且应该)使用真正的退出代码,而不是从文本输出中提取它:

import() {
    sudo -u nginx php /var/www/html/shell/global/full_import.php --import "$@"
}

for i in {1..3}; do
    echo "Importing..."
    status=0
    import finance_backup
    (( status += $? ))
    import finance_deactivate_quotes
    (( status += $? ))
    import finance
    (( status += $? ))
    if (( status == 0 )); then
        echo "Success."
        break
    fi
    echo "Error."
done

这将打印nginx命令的输出。如果您不想看到输出,请>&-在命令末尾添加,直接在"$@".

再次只运行失败的命令

到目前为止,我们再次运行了所有三个导入,即使其中只有一个失败。你说你想那样做,但我觉得这很奇怪。这些命令似乎是独立的,因此仅再次运行那些失败的命令是有意义的:

import() {
    sudo -u nginx php /var/www/html/shell/global/full_import.php --import "$@"
}
for arg in finance_backup finance_deactivate_quotes finance; do
    for i in {1..3}; do
        if import "$arg"; then
            echo "Success."
            break
        fi
        echo "Error."
    done
done

推荐阅读