Bash:正确处理错误

标签 bash shell error-handling

我有类似于以下的 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/

相关文章:

linux - 新手错误 : cp: omitting directory

php - 引用 - 这个错误在 PHP 中意味着什么?

java - Spring @ExceptionHandler 不处理错误

unix - 从文件/grep 中删除重复的行

regex - 如何将文件的内容插入到 perl/shell 中的另一个文件(如果正则表达式)中

javascript - (错误)日志记录的最佳实践

linux - 提取字符串列表的某些部分并将它们不重复地设置在列表中

linux - Bash:杀死子进程中的所有进程

linux - 使用命令行和完整路径启动 Bash 脚本

Linux Bash函数条件执行用户输入