
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