所以我的问题是我试图弄清楚如何从我发布的命令中读取输出。
因此,输出将粘贴显示导入结果的文本块,并且在文本中还说退出代码= 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
答案 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