我有一个bash脚本,它检查文件是否已经存在或已经更改。如果任何一种情况都是正确的,请将文件从一个位置复制到另一个位置。
DIR="$( cd "$( dirname "${BASH_SOURCE}" )/my-dir" && pwd )"
FILE="file.json"
copy() {
local SAME=$(cmp --silent "${DIR}/${FILE}" "${PWD}/${FILE}")
if [ ! -f "${PWD}/${FILE}" ] || [ ! $SAME ]; then
cp "${DIR}/${FILE}" "${PWD}/${FILE}" && echo "'$FILE' has been copied." || echo "Copy of '$FILE' has failed.";
else
echo "'$FILE' already exists and has not changed (not copied).";
fi;
}
copy但是,当文件存在且未更改时,仍将复制该文件。
echo "$SAME"不回显任何内容,但echo $?回显退出代码
因此,我的问题是:在某种情况下,是否可以否定“cmp”命令的输出?
谢谢。
发布于 2017-02-07 18:56:16
你需要引用你的参数展开。如果$SAME是空字符串(因为您使用了--silent),那么测试将转移到[ ! ]。因为!是一个非空字符串,所以测试成功.
if [ ! -f "${PWD}/${FILE}" ] || [ ! "$SAME" ]; thenSAME还需要包含cmp的输出。
SAME=$(cmp "${DIR}/${FILE}" "${PWD}/${FILE}")但是,最好忽略cmp的实际输出,而使用它的退出状态。
if [ ! -f "$PWD/$FILE" ] || ! cmp --silent "${DIR}/${FILE}" "${PWD}/${FILE}"; thenhttps://stackoverflow.com/questions/42097680
复制相似问题