条件重定向附加/覆盖

时间:2015-08-21 13:15:41

标签: bash shell redirect if-statement

我有一个条件,取决于我想要追加或覆盖这样的文件:

if [ "${CONDITION}" -eq 1 ]; then
   echo "writing some info"
   echo "${INFO1}" > "${FILE1}"
   echo "${INFO2}" > "{$FILE2}"
   ...
else
   echo "Appending some info"
   echo "${INFO1}" >> "${FILE1}"
   echo "${INFO2}" >> "{$FILE2}"
   ...
fi

问题是ifelse块相对较大(每行20行),除重定向差异外基本相同。这让我觉得非常糟糕。

我怎样才能避免这种糟糕的风格?即我需要只有一个这样的块,并以其他方式定义append / overwrite动作。

3 个答案:

答案 0 :(得分:2)

为什么不让if语句删除日志文件? 那么你只有一组回声。 或者,如果日志文件的权限非常特殊,您可以通过将/ dev / null复制到它们来截断它们而不会丢失权限。 然后回声是if语句之外的单个集合。 我怀疑你需要关于追加或写作的回声吗?

答案 1 :(得分:2)

使用条件以写入模式打开文件(创建/截断它们),然后无条件地附加到它们。

if [ "${CONDITION}" -eq 1 ]; then
    : > "${FILE1}"
    : > "${FILE2}"
    echo "writing some info"
else
    echo "appending some info"
fi

# Will create files where necessary
echo "${INFO1}" >> "${FILE1}"
echo "${INFO2}" >> "{$FILE2}"
...

答案 2 :(得分:1)

您可以使用类似的子shell来分解重定向部分:

if [ "${CONDITION}" -eq 1 ]; then
   echo "writing some info"
   (echo "${INFO1}"
   echo "${INFO2}") > "{$FILE2}"
   # ...
else
   echo "Appending some info"
   (echo "${INFO1}" 
   echo "${INFO2}") >> "{$FILE2}"
   # ...
fi

然后你可能会重构子shell中的代码(在parens之间)

function do_echos {
      echo "${INFO1}"
      echo "${INFO2}"
      # ...
}

if [ "${CONDITION}" -eq 1 ]; then
   echo "writing some info"
   (do_echos) > "{$FILE2}"
else
   echo "Appending some info"
   (do_echos) >> "{$FILE2}"
fi

现在一切都只写在一个地方,你应该能够从那里扩展它。

原始答案

如果除了重定向行之外所有行都相同,那么拉出条件之外的所有行。 Avoiding duplication of code是一个非常好的主意,因为您可以通过更改该行的一个副本来引入错误,而不会意识到您还需要在其他地方更改它。