如何在shell脚本中执行复合命令?

如何在shell脚本中执行复合命令?

这是我的脚本:

#!/bin/sh

result=$((diff <(sort 1.txt) <(sort 2.txt)))
if [[ $result != "" ]]
then
    echo ERROR
else
    echo PASS
fi

执行此脚本时出现错误:

chk.sh: line 3: diff <(sort 1.txt) <(sort 2.txt): missing `)' (error token is "1.txt) <(sort 2.txt)")

原因是什么以及如何解决?

答案1

几点:

  • 进程替换 ( <( ... )) 和扩展测试语法[[ ... ]]在 sh 中不可用。您需要更高级的 shell,例如 bash 或 ksh。
  • $(( ... ))是算术替换,不是命令替换。你需要$( ... )这里。
  • diff您可以diff直接在条件中检查退出状态,而不是检查 的输出if。您可以丢弃未使用的输出。 (所以你甚至不需要命令替换或[[ ... ]]在这里。)

以及评论中的建议:

  • if您可以通过交换ifelse块来避免否定条件
  • cmp -s如果您只想检查文件是否不同,则可以使用同样高效的命令。

综合:

#!/bin/bash

if cmp -s <(sort 1.txt) <(sort 2.txt)
then
    echo PASS
else
    echo ERROR
fi

相关内容