linux - 如何在字符串中捕获返回码并重新运行
问题描述
所以我的问题是我试图弄清楚如何从我发布的命令中读取输出。
因此,输出粘贴了一个显示导入结果的文本块,并且在文本中它还显示退出代码 = 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
解决方案
提取文本
您可以使用它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
推荐阅读
- swift - 选择错误答案按钮时如何显示正确答案?
- r - 如何用其他环境覆盖 .GlobalEnv
- flutter - Dart 从 UInt8List 获取扩展
- symfony - 如何在 Symfony 表单中动态定义字段的类型?
- asp.net - 无效的列名鉴别器
- javascript - Apexcharts 市场深度图表问题
- arrays - React Typescript - 将字符串数组中的更多元素添加到 useState 数组
- c# - 运行调试 vs 2019 设置会话变量返回 NullReferenceException
- google-sheets - 尽管具有统一的数据类型,但 Google QUERY 函数不会提取数据
- java - 如何在 Windows 和 Linux 上使用 Spring 框架在 Java 中将文件作为流返回