我有类似于以下的 bash 脚本:
{
# Try block
command 1
command 2
command 3
} || {
# Catch errors
while true; do
{
# Try block inside
# Change parameters for command 1, command 2
command 1
command 2
command 3
break
} || {
# Change parameters and try again
continue
}
done
}
这段代码或多或少可以正常工作,但是......
出于某种原因,try
部分对我来说并不像预期的那样有效。我认为如果我的某些命令返回不是 0
代码,它就会失败,但事实并非如此。
对于某些特定情况,我的 command 2
在第一个 try block 中返回 1
代码,但它不会失败并进入 catch
部分,命令 3
从这个 try
block 执行,仅此而已。
这是我的问题:
如何处理 bash 中的错误?只是为了玩弄返回码?
更新:
原始代码看起来非常类似于:
主要思想是所有 3 个命令都应该一个接一个地执行,并且它们都以某种方式与 folder_name
相关。
folder_name=my_folder
suffix=0
{
cd /home/test/
mkdir $folder_name
ls -la $folder_name
} || {
while true; do
suffix=$(expr $suffix + 1)
{
folder_name=$folder_name_$suffix
cd /home/test/
mkdir $folder_name
ls -la $folder_name
break
} || {
continue
}
done
}
最佳答案
我在这里看到两个问题。
当使用花括号对命令进行分组时,末尾必须有一个分号(或者在右括号之前有一个换行符)。引用docs here
另一方面,您无论如何都不会考虑返回码。您通常使用类似 [[ $? -eq 0 ]]
。但在这里,您可以简单地使用 &&
链接命令。
例如
{
cd /home/test/ &&
mkdir $folder_name &&
ls -la $folder_name;
}
但是,下面会做你需要的。
cd /home/test/
prefix=my_folder
suffix=0
folder_name="$prefix"
while true; do
if [[ -e $folder_name ]]; then
folder_name="${prefix}_$((++suffix))"
continue
fi
mkdir "$folder_name"
if [[ $? -ne 0 ]]; then
echo "mkdir failed"
exit 1
fi
break
done
关于Bash:正确处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45398613/