シェルスクリプトで複合コマンドを実行するには?

シェルスクリプトで複合コマンドを実行するには?

これは私のスクリプトです。

#!/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では、プロセス置換(<( ... ))および拡張テスト構文は[[ ... ]]使用できません。 bashやkshなどの高度なシェルが必要です。
  • $(( ... ))命令置換ではなく算術置換です。ここに必要です$( ... )
  • diffdiff出力を確認する代わりに、条件から直接終了状態を確認できますif。未使用の出力を削除できます。 (したがって、コマンドの置き換えやここも必要ありません[[ ... ]]。)

そしてコメントに提案があります:

  • ifif交換とブロックにより、否定的なelse条件を避けることができます。
  • cmp -sファイルが異なることを確認するには、同じ効率的なコマンドを使用できます。

包括的な:

#!/bin/bash

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

おすすめ記事