【问题标题】:Linux Bash Script Error HandlingLinux Bash 脚本错误处理
【发布时间】:2015-05-23 23:26:45
【问题描述】:

我在 Linux 中使用 bash 脚本来迁移数据库输出文件,我想知道在 bash 脚本中执行 Linux 命令时如何处理错误。

例如,通常当我想遍历目录中的文件时,我会这样写

# list files and grep results for .sql extension
for FILE in `ls | grep ".sql"`
do
    echo "found file: $FILE"
done

这非常有效,因为如果 grep 具有 .sql 扩展名,则返回文件名或不返回任何内容

我想知道如何使用返回结果或错误的 Linux 命令,例如

ls ./*.sql

返回文件名,如果找不到文件则返回错误

ls: ./*.sql: No such file or directory

是否可以检查 Linux 命令是否在 bash 脚本中返回错误?

【问题讨论】:

  • 改掉使用 ALL_CAPS_VARS 的习惯:some day you'll use PATH 然后想知道为什么你的脚本坏了。
  • 通常我将我的变量命名为 LV_STR 或 LV_FILE,我不会愚蠢地命名一个 var PATH

标签: linux bash error-handling


【解决方案1】:

您可以使用&&|| 检查错误:

ls ./*.sql && echo "some files exist" || echo "no such files exist"

查看$?可以得到上次运行程序的错误码:

ls ./*.sql ; echo $?

【讨论】:

    【解决方案2】:

    首先,这里不需要ls 命令。你可以这样做:

    # list files and grep results for .sql extension
    for file in *.sql; do
        echo "found file: $file"
    done
    

    如果*.sql 文件不存在,那么为了避免单次迭代,请使用:

    shopt -s nullglob
    # list files and grep results for .sql extension
    for file in *.sql; do
        echo "found file: $file"
    done
    

    一般来说,您可以在运行任何命令后检查$?,以检查最近执行的命令的状态。

    【讨论】:

      【解决方案3】:

      您可以使用 bash 中的 $? 变量检查上次运行命令的退出代码。按照惯例,成功执行返回0,失败执行返回1 或更高版本。举个例子:

      $ touch /root/test 
      touch: cannot touch ‘/root/test’: Permission denied
      $ echo $?
      1
      

      您可以像这样将其合并到您的 bash 脚本中:

      #!/bin/bash
      
      touch /root/test
      
      if [ $? -eq 0 ]
      then
        echo "Successfully created file"
      else
        echo "Could not create file"
      fi
      

      【讨论】:

        猜你喜欢
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        相关资源
        最近更新 更多