如何在采购之前语法检查shell脚本?

时间:2017-10-05 04:42:08

标签: bash shell

我想运行此命令source .env(获取.env文件),如果.env文件在采购时出现了一些错误。我想在错误输出之前显示一条消息“嘿,你的.env中有错误”,否则如果没有错误,我不想显示任何内容。

以下是需要编辑的代码示例:

#!/bin/zsh

env_auto_sourcing() {
  if [[ -f .env ]]; then    

    OUTPUT="$(source .env &> /dev/null)" 
    echo "${OUTPUT}"

    if [ -n "$OUTPUT" ]; then
        echo "Hey you got errors in your .env"
        echo "$OUTPUT"

  fi
}

2 个答案:

答案 0 :(得分:2)

您可以使用bash -nzsh也有-n选项)在获取脚本之前对其进行语法检查:

 env_auto_sourcing() {
  if [[ -f .env ]]; then
    if errs=$(bash -n .env 2>&1); 
        then source .env; 
    else 
        printf '%s\n' "Hey you got errors" "$errs"; 
    fi
  fi
 }

将语法检查错误存储在文件中比您在代码中使用的子shell方法更清晰。

bash -n有一些陷阱,如下所示:

答案 1 :(得分:1)

为什么不直接使用命令 source 中的退出代码?

您不必为此使用 bash -n,因为 ...

假设您的 .env 文件包含这 2 行无效的行:

dsadsd
sdss

如果您使用上面的示例运行当前接受的代码:

if errs=$(bash -n .env 2>&1);

上述情况将无法阻止文件的采购。

因此,您可以使用 source 命令返回码来处理所有这些:

#!/bin/bash
# This doesn't actually source it. It just test if source is working
errs=$(source ".env" 2>&1 >/dev/null)
# get the return code
retval=$?
#echo "${retval}"
if [ ${retval} = 0 ]; then
  # Do another check for any syntax error
  if [ -n "${errs}" ]; then
    echo "The source file returns 0 but you got syntax errors: "
    echo "Error details:"
    printf "%s\n" "${errs}"
    exit 1
  else
    # Success here. we know that this command works without error so we source it
    echo "The source file returns 0 and no syntax errors: "
    source ".env"
  fi
else
  echo "The source command returns an error code ${retval}: "
  echo "Error details:"
  printf "%s\n" "${errs}"
  exit 1
fi

这种方法最好的一点是,它还会检查 bash 语法和 source 语法:

现在您可以在您的 env 文件中测试这些数据:

-
~
@
~<
>