Ich habe den folgenden einfachen KSH-Code:
MY_LIST=first,second,third
NUM_IN_LIST=` echo $MY_LIST | sed s"/,/ /g" | wc -w `
print $NUM_IN_LIST
3
[[ $NUM_IN_LIST = 3 ]] && print match
but I dont get the match print -:(
vielleicht wegen einiger Leerzeichen?
kann ich einen anderen Vorschlag zum Zählen und Drucken der Wörter in $MY_LIST bekommen? (nachdem das Trennzeichen "," entfernt wurde)
Antwort1
Ihr Beispiel funktioniert für mich.
Hier ist eine Alternative:
MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match
Antwort2
Ihr Code sollte funktionieren, aber nur, wenn $MY_LIST
er keines der folgenden Sonderzeichen enthält:
echo $MY_LIST
printf %s "$MY_LIST"
sollte oder seinprint -r -- "$MY_LIST"
. Das Fehlen von Anführungszeichen weist die Shell an, Globbing-Zeichen zu erweitern\\*?[
. Es weist die Shell auch an, Wörter an Leerzeichen zu trennen, obwohl das hier keine Rolle spielen würde, wenn da nicht das nächste Problem wäre.- Die zusätzliche Verwendung führt unter Umständen
echo
zur Interpretation von Backslashes und einem führenden Schrägstrich .-
- `sed s"/,/ /g" macht sowohl Kommas als auch Leerzeichen zu Worttrennern.
Ein weiteres Problem, das erklärt, warum Ihr abschließender Test nicht funktioniert, ist, dass wc -w
eine Ausgabe mit führenden Leerzeichen erzeugt wird, die in erfasst werden $NUM_IN_LIST
. print $NUM_IN_LIST
führt eine Worttrennung bei durch $NUM_IN_LIST
, sodass am Ende nur die Ziffern gedruckt werden; tun Sie dies, print "$NUM_IN_LIST"
um den Unterschied zu sehen. Die [[ … ]]
Konstruktion verhindert die Worttrennung und =
ist ein String-Vergleichsoperator, daher wird Ihnen richtig gesagt, dass dies ' 3'
nicht dasselbe ist wie '3'
. [[ $NUM_IN_LIST -eq 3 ]]
oder [ $NUM_IN_LIST = 3 ]
wahr gewesen wäre (aber keines von beiden ist eine echte Lösung, es sind nur begrenzte Workarounds).
Eine reine KSH-Methode zum Anzeigen der Anzahl kommagetrennter Felder ist
commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}
Wenn jemand eine POSIX-sh-Lösung benötigt, ersetzen Sie die erste Zeile durch commas=$(printf %s "$MY_LIST" | tr -dc ,)
.