我有一个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"
退出代码 0 , echo $?
不回应任何内容
所以我的问题是:是否有可能在条件中否定'cmp'命令的输出?
感谢。
答案 0 :(得分:0)
您需要引用参数扩展。如果$SAME
是空字符串(并且它始终是,因为您使用--silent
),您的测试将转换为[ ! ]
。因为!
是非空字符串,所以测试成功。
if [ ! -f "${PWD}/${FILE}" ] || [ ! "$SAME" ]; then
SAME
还需要包含 cmp
的输出:
SAME=$(cmp "${DIR}/${FILE}" "${PWD}/${FILE}")
但是,最好忽略cmp
的实际输出并改为使用退出状态。
if [ ! -f "$PWD/$FILE" ] || ! cmp --silent "${DIR}/${FILE}" "${PWD}/${FILE}"; then