2つの変数に格納されている2つの行があります。しかし、どこに保存されているかは問題ではありません。私の質問は、2行の各文字をどのように比較しますか?
いくつかの例を見てください
こんにちは
こんにちは
結果:真(H)、偽...、真(o)
答え1
あなたが探しているものは次のとおりです。
l1=Hello
l2=Hlleo
count=`echo $l1|wc -m`
for cursor in `seq 1 $count`
do
c1=`echo $l1|cut -c$cursor`
c2=`echo $l2|cut -c$cursor`
if test "$c1" = "$c2"
then
echo "true ($c1), "
else
echo "false ($c2 instead of $c1), "
fi
done
答え2
どちらも同じ文字長を持つ場合:
string_1="hello"
string_2="hilda"
for (( i=0; i<${#string_1}; i++ )); do
[ "${string_1:$i:1}" == "${string_2:$i:1}" ] && echo "true" || echo "false"
done
答え3
shでこれを行うことは可能ですが、大きな文字列ではそれほど効率的ではありません。
compare_characters () {
tail1="$1" tail2="$2"
if [ "${#tail1}" -ne "${#tail2}" ]; then
echo >&2 "The strings have different length"
return 1
fi
while [ -n "$tail1" ]; do
h1="${tail1%"${tail1#?}"}" h2="${tail2%"${tail2#?}"}"
if [ "$h1" = "$h2" ]; then
echo true "$h1"
else
echo false "$h1" "$h2"
fi
tail1="${tail1#?}" tail2="${tail2#?}"
done
}
または、他の出力形式が気に入らない場合は、次のものを使用できます。cmp -l
。プロセス置換(ksh、bash、またはzsh)を持つシェルでは:
cmp <(printf %s "$string1") <(printf %s "$string2")
/dev/fd
プロセスを交換せずに回避策を使用して名前付きパイプ、一時ファイルへの書き込み、またはプラットフォームでサポートされている場合は、両方の文字列をコマンドに渡す必要があります。
printf %s "$string1" | {
exec 3<&0
printf %s "$string2" | cmp /dev/fd/3 /dev/fd/0
}
答え4
var1="string1"
var2="string2"
i=1
l=${#var1}
while [ ${i} -le ${l} ]
do
c1=$(echo ${var1}|cut -c ${i})
c2=$(echo ${var2}|cut -c ${i})
if [ ${c1} == ${c2} ]
then
printf "True (${c1}) "
else
printf "False "
fi
(( i++ ))
done
両方の変数の文字列の長さが等しくない場合、結果はあいまいです。スクリプトでは、両方の変数の文字列の長さが同じであると仮定します。