私のブール出力がこのように動作するのはなぜですか? [閉鎖]

私のブール出力がこのように動作するのはなぜですか? [閉鎖]

本質的に私が言いたいことは次のとおりです。

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コマンドではなくループを作成する必要があります。

おすすめ記事