Wörter in LISTE ohne Trennzeichen zählen

Wörter in LISTE ohne Trennzeichen zählen

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_LISTer keines der folgenden Sonderzeichen enthält:

  • echo $MY_LISTprintf %s "$MY_LIST"sollte oder sein print -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 echozur 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 -weine Ausgabe mit führenden Leerzeichen erzeugt wird, die in erfasst werden $NUM_IN_LIST. print $NUM_IN_LISTfü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 ,).

verwandte Informationen