スペースを無視して文字列比較を実行するには?

スペースを無視して文字列比較を実行するには?

2つの文字列を比較しますが、スペースを無視する方法は?私は次のことをしています:

if [ "$a" == "$b" ]; then
   echo ok
fi

ところで似合わないようです。 「a」と「b」が何であるかを印刷しましたが、どちらも同じです。しかし、彼らは別の改行を使用しているようです。

答え1

技術的にすべてのスペースを無視するには、次の2つの文字列を渡すことができますtr

[ "$(echo "$a" | tr -d '[:space:]')" = "$(echo "$b" | tr -d '[:space:]')" ]

ただし、これを行うと、比較する前にすべてのスペースが削除されるため、たとえば、および"a b"同一"ab"性をテストします。これが望ましいかどうかはわかりません。tr必要な操作を実行するようにフィルタを調整できます。たとえば、すべてのスタイルの改行のみを削除するには、次のようにしますtr -d '\n\r'

答え2

Bashでは、次のものを使用できます。パラメータ拡張構文特定の文字が削除された(またはより一般的にパターン発生を置き換える)変数の値を取得します。

if [[ "${a//[$' \t\n\r']/}" == "${b//[$' \t\n\r']/}" ]]; then
  echo ok
fi

問題が「別の改行文字を使用する」ことであれば、おそらくその1つがWindowsファイルから来たことを意味します。 Windows行には、$'\r改行文字()の前に追加のCR(bash構文のキャリッジリターン)があります$'\n'。複数行の文字列がある場合は、CR文字のみを削除してください。

if [[ "${a//$'\r'/}" == "${b//$'\r'/}" ]]; then
  echo ok
fi

変数が単一行文字列の場合は、問題のあるCRが最後に表示され、サフィックス除去構文を使用できます。

if [[ "${a%$'\r'}" == "${b%$'\r'}" ]]; then
  echo ok
fi

単純なsh形式が必要な場合(少ない)難しさは、CR文字を入力することです。

cr=$(printf '\r')
if [[ "${a%$cr}" == "${b%$cr}" ]]; then
  echo ok
fi

関連情報