Bash:否定'cmp'命令的输出不起作用

时间:2017-02-07 18:53:18

标签: bash if-statement exit-code

我有一个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'命令的输出?

感谢。

1 个答案:

答案 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