Comparaison de chaine mystère

Bonjour,

J’ai une chaine qui est:

echo $line; echo $line | hexdump -v
-w /etc/group -p wa -k identity
0000000 772d 2f20 7465 2f63 7267 756f 2070 702d
0000010 7720 2061 6b2d 6920 6564 746e 7469 0a79
0000020

et une autre chaine qui est:

echo ${output[$count]}; echo ${output[$count]} |  hexdump -v
-w /etc/group -p wa -k identity
0000000 772d 2f20 7465 2f63 7267 756f 2070 702d
0000010 7720 2061 6b2d 6920 6564 746e 7469 0a79
0000020

Elles sont donc rigoureusement identiques.
Mais quand je les compare:

[ "$line" = "${output[$count]}" ] && echo "ok" || echo "nok"
nok

Si je fait le même test avec le texte au lieu des variables c’est bon.

Quelqu’un saurait-il me dire pourquoi?

C’est lié aux variables dans la suite de commandes mais je ne sais pas pourquoi:

        res=true
        check="$TMPCISDISK/CIS-6_2_3_8_check.disk"
        output=("-w /etc/group -p wa -k identity " \
                        "-w /etc/passwd -p wa -k identity" \
                        "-w /etc/gshadow -p wa -k identity" \
                        "-w /etc/shadow -p wa -k identity" \
                        "-w /etc/security/opasswd -p wa -k identity" \
                        "-w /etc/nsswitch.conf -p wa -k identity" \
                        "-w /etc/pam.conf -p wa -k identity" \
                        "-w /etc/pam.d -p wa -k identity")
        count=0
        if [ -s $check ]; then
                while IFS= read -r line
                do
                        [ "$line" != "${output[$count]}" ] && { res=false; break; }
                        count=$((count+1))
                done < $check
        else
                res=false
        fi
        echo $res

J’ai trouvé la 1ère ligne dans la variable output contient un espace en fin de ligne…
Bizarre qu’elle n’ait pas été visible dans les impressions…
Donc le code est bon finalement :slight_smile: