如何在字符串中捕获返回代码并重新运行

时间:2019-03-28 09:12:38

标签: linux bash

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

因此,输出将粘贴显示导入结果的文本块,并且在文本中还说退出代码= 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

1 个答案:

答案 0 :(得分:1)

提取文字

您可以使用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