2017-01-24 7 views
3

考えられるのは、指定された2つのファイルの内容が完全に同じかどうかを区別することです。ファイルの類似性の大文字と小文字を区別する方法

file1がalphaで、file2がAlphAだった場合、スクリプトfile1 file2は 'Same'と表示されます。

スクリプトケースを機密にするにはどうすればよいですか?

#!/bin/bash 
if cmp $1 $2 >/dev/null ; then 
    echo "Mostly the same." 
else 
    echo "Different." 
fi 

答えて

4

cmpは、バイト単位の比較を使用しています:

if cmp -s <(tr '[:upper:]' '[:lower:]' <"$1") <(tr '[:upper:]' '[:lower:]' <"$2"); then 
    echo "Mostly the same." 
else 
    echo "Different." 
fi 
  • -sますがcmpサイレント - 差異がある場合は印刷されません。

  • <(...)は、大まかに言えば、コマンドの出力を一時的で効果的な自己削除ファイルとして表示します。プロセス置換はパイプを使用するため、それらを使用するとメモリ効率がよく、大きな出力セットのある でも動作します。

  • tr '[:upper:]' '[:lower:]'は、stdinで提供される文字の大文字から小文字への変換を実行し、結果としてすべて小文字が出力されます。

  • $1$2は、二重引用符で囲まれたそれらの値がそのままである(二重引用符shell expansionsから値を保護)を使用していることを保証するためにあるかに注意してください。

1

はおそらく:あなたが最初に独自の大文字小文字の変換を行う必要がありますので

file1=$(cat $1 | tr '[:upper:]' '[:lower:]') 
file2=$(cat $2 | tr '[:upper:]' '[:lower:]') 

if [ "$file1" = "$file2" ]; then 
    echo "same" 
else 
    echo "different" 
fi 
+0

これは、より多くのメモリ効率の高いソリューションが利用可能な場合、(引用ダブルと脇 'cat'の無駄な使用の欠如を残す)が、メモリにファイル全体を読み込むが最高の回避され動作します。 – mklement0

1

ファイルが十分小さい場合は、より簡単に行うことができます。

#!/bin/bash 
f1="$(<"$1")" 
f2="$(<"$2")" 
if 
    [[ "${f1^^}" = "${f2^^}" ]] 
then 
    echo "Mostly the same." 
else 
echo "Different." 
fi 
+1

++ですが、変数値全体を大文字に変換する '^^'パラメータの拡張にはBash v4 +が必要です(macOSでは動作しません)。 – mklement0

関連する問題