本質的に私が言いたいことは次のとおりです。
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
コマンドではなくループを作成する必要があります。