我有一个条件,取决于我想要追加或覆盖这样的文件:
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
问题是if
和else
块相对较大(每行20行),除重定向差异外基本相同。这让我觉得非常糟糕。
我怎样才能避免这种糟糕的风格?即我需要只有一个这样的块,并以其他方式定义append / overwrite动作。
答案 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是一个非常好的主意,因为您可以通过更改该行的一个副本来引入错误,而不会意识到您还需要在其他地方更改它。