为什么我的布尔输出会这样?

为什么我的布尔输出会这样?

本质上,我想说的是:

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_TEXCP_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命令。

相关内容