shell脚本中的异常处理?

时间:2011-08-05 19:06:14

标签: bash shell exception-handling

我正在寻找shell脚本中的异常处理机制。有没有尝试,在shell脚本中捕获等效机制?

5 个答案:

答案 0 :(得分:104)

bash中确实没有try/catch(我假设您正在使用bash),但使用&&||可以实现非常相似的行为。

在此示例中,如果fallback_command 失败(返回非零值),则需要运行a_command

a_command || fallback_command

在此示例中,如果second_command 成功(返回0),则需要执行a_command

a_command && second_command

使用子shell可以轻松地将它们混合在一起,例如,以下命令将执行a_command,如果成功,它将运行other_command,但如果a_command或{ {1}}失败,other_command将被执行:

fallback_command

答案 1 :(得分:11)

if / else结构和退出代码可以帮助你伪造一些。这应该适用于Bash或Bourne(sh)。

if foo ; then
else
  e=$?        # return code from if
  if [ "${e}" -eq "1"]; then
    echo "Foo returned exit code 1"
  elif [ "${e}" -gt "1"]; then
    echo "Foo returned BAD exit code ${e}"
  fi
fi

答案 2 :(得分:4)

WITH sample_data ( "COMMENT" ) AS (
  SELECT '||1|21|-1|-1|-1|0||||' FROM DUAL
)
SELECT REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 1, NULL, 1 ) AS col1,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 2, NULL, 1 ) AS col2,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 3, NULL, 1 ) AS col3,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 4, NULL, 1 ) AS col4,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 5, NULL, 1 ) AS col5,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 6, NULL, 1 ) AS col6,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 7, NULL, 1 ) AS col7,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 8, NULL, 1 ) AS col8,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 9, NULL, 1 ) AS col9,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 10, NULL, 1 ) AS col10,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 11, NULL, 1 ) AS col11,
       REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 12, NULL, 1 ) AS col12
FROM   sample_data;

答案 3 :(得分:3)

以下是bash中的two simple bashfunctions which enable eventhandling

您可以将它用于基本的异常处理,如下所示:

onFoo(){
  echo "onFoo() called width arg $1!"
}  

foo(){
  [[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
} 

addListener EXCEPTION_FOO_OCCURED onFoo

bash不支持使用try / catch块进行异常处理,但是,您可能想尝试查看支持它的BANGSH框架(它有点像bash的jquery)。

但是,没有级联try / catch-blocks的异常处理类似于 eventhandling > 可以使用array-support几乎任何语言。

如果你想让你的代码保持整洁(没有if / else冗长),我建议使用事件。

MatToufoutu推荐的建议(使用||和&&)不建议用于功能,但确定简单命令。 (关于风险,见BashPitfalls

答案 4 :(得分:0)

如果error_exit是接受一个参数的函数,请使用以下命令正确处理错误。如果未传递参数,则会在实际发生错误的地方使用LineNo抛出未知错误。请在实际用于生产之前进行实验-

#!/bin/bash

PROGNAME=$(basename $0)

error_exit()

{

    echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
    exit 1
}

echo "Example of error with line number and message"
error_exit "$LINENO: An error has occurred."