本质上,我想说的是:
if [ X1 ] || [ X2 ]
then
e1 && a && b && e2
else
e3
done
但是当 X1 和 X2 为 FALSE 时,e1、a、b 和 e2 无论如何都会运行。如果 X1 和 X2 为真,则会发生同样的情况。我的布尔值的行为非常奇怪,我不明白为什么......
我有以下代码:
#! /bin/bash
#Define local variables
REPLACING="\033[01;31mReplacing outdated .tex and .json in git repository.\033[0;38m"
COMPLETED="\033[1;38;5;2mTransfer complete.\033[0;38m"
ALL_GOOD="\033[1;38;5;2mYour git repository's templates directory is up to date with your local templates directory connected to TeXStudio IDE.\033[0;38m"
CURRENT_DIR="/Users/jakeireland/Documents/my_macros"
LOCAL_DIR="/Users/jakeireland/.config/texstudio/templates/user/"
GIT_DIR="${CURRENT_DIR}/tea_templates/"
TEX_OLD="${GIT_DIR}*.tex"
JSON_OLD="${GIT_DIR}*.json"
TEX_NEW="${LOCAL_DIR}*.tex"
JSON_NEW="${LOCAL_DIR}*.json"
#Functions to determine congruence of local versus git dir
#cmp -s /path/to/outdated/dir path/to/up-to-date/dir
TEX_CLEAN=$(cmp -s "${TEX_OLD}" "${TEX_NEW}" || echo "tex-err")
JSON_CLEAN=$(cmp -s "${JSON_OLD}" "${JSON_NEW}" || echo "json-err")
#Define functions to copy new files to old directory
#cp -fr /source/file /destination/path
CP_TEX=$(cp -fr ${TEX_NEW} ${GIT_DIR})
CP_JSON=$(cp -fr ${JSON_NEW} ${GIT_DIR})
#Begin script
cd "${CURRENT_DIR}"
if [[ "$TEX_CLEAN" = "tex-err" ]] || [[ "$JSON_CLEAN" = "json-err" ]] ; then
echo -e "${REPLACING}" && $CP_TEX && $CP_JSON && echo -e "${COMPLETED}"
else
echo -e "${ALL_GOOD}"
fi
答案1
你误会了问题出在哪里。如果您在启用跟踪的情况下运行程序(例如bash -x the_script
),那么您将看到会发生什么。
这些行没有定义函数:
#Define functions to copy new files to old directory
CP_TEX=$(cp -fr ${TEX_NEW} ${GIT_DIR})
CP_JSON=$(cp -fr ${JSON_NEW} ${GIT_DIR})
这里发生的是,我们正在运行命令并将输出分配给这些变量CP_TEX
和CP_JSON
。
如果你真的想定义函数,那么你会写:
cp_tex() {
cp -fr ${TEX_NEW} ${GIT_DIR}
}
cp_json() {
cp -fr ${JSON_NEW} ${GIT_DIR}
}
然而,对于单一用途,几乎不需要定义函数。我只是将它们内联写入,如下所示:
cd "${CURRENT_DIR}" || exit $? # remember that `cd` can fail
if cmp -s "${TEX_OLD}" "${TEX_NEW}" || cmp -s "${JSON_OLD}" "${JSON_NEW}"
then
echo -e "${ALL_GOOD}"
else
echo -e "${REPLACING}"
cp -fr "${TEX_NEW}" "${JSON_NEW}" "${GIT_DIR}"
echo -e "${COMPLETED}"
fi
当然,这一切都假设您确实正在使用一个名为 的文件*.tex
和一个名为 的文件。*.json
如果您希望这些是通配符,则需要编写一个循环而不是一个简单的cmp
命令。