2017-04-09 2 views
0

Ich versuche, alle möglichen Kombinationen von a Zeichenfolgen innerhalb eines bestimmten Befehls zu erhalten, außer wenn die Zeichenfolgen identisch sind. Ich vereinfacht, was ich versuche zu tun ist, wie ich es versucht zu tun, wie folgt:bash: wenn Anweisung innerhalb von for-Schleife nicht funktioniert

for i in a b c 
do 
for p in a b c 
do 
if [ $i -ne $p ] 
then 
echo "$i and $p" 
fi 
done 
done 

Der Ausgang erwarte ich ist:

a b 
a c 
b a 
b c 
c a 
c b 

Aber es scheint nicht .. irgendwelche Ideen zu arbeiten Was stimmt nicht mit meinen verschachtelten for-Schleifen?

+0

Dies könnte helfen: 'help test' – Cyrus

Antwort

3

ersetzen:

if [ $i -ne $p ] 

mit:

if [ "$i" != "$p" ] 

Der -ne Operator ganzen Zahlen erfordert. Der Operator != arbeitet mit Zeichenfolgen.

Sie sollten in der Regel doppelte Zeichenketten in Tests angeben, es sei denn, Sie sind wirklich, wirklich sicher, dass sie nicht mehr als ein Wort enthalten können (wie von der Shell nach der Worttrennung gesehen).

Wenn Sie Bash verwenden, können Sie das Bash-spezifische [[ ]] Testkonstrukt verwenden.

if [[ $i != "$p" ]] 

doppelte Anführungszeichen in der Regel nicht in dieser Art von Test benötigt, da stattdessen ein Befehl zu sein, es ist spezielle Shell-Syntax und ist nicht auf Wort Aufspalten ausgesetzt. Der rechte Teil des Vergleichs sollte jedoch in Anführungszeichen gesetzt werden, um den Mustervergleich zu deaktivieren, es sei denn, Sie sind absolut sicher, dass keine Zeichenkette, die jemals dort verwendet wird, einen Mustervergleich auslösen könnte.

Verwandte Themen