Übung zum Zeichenzählen (bash)

Übung zum Zeichenzählen (bash)

Ich habe das folgende Skript, das Zeichen in der Benutzereingabe zählt:

    echo -n "Type text: ";
    read mystring;
    echo -n $mystring | wc -m;

Ohne das „-n“ in der letzten Zeile wäre die Zeichenzählung falsch, weil sie auch das von echo dort eingefügte Zeilenumbruchzeichen enthalten würde (so würde die Zählung z. B. für „abc“ 4 statt 3 betragen).

Aus Übungsgründen möchte ich diese Korrektur nun auf eine etwas kompliziertere Art und Weise durchführen. Die Grundidee ist folgende:

     var=$($mystring | wc -m);
     echo -n "Type text: ";
     read mystring;
     echo $(( $var - 1 ));

Die Zeichenanzahl der Benutzereingabe wird also zu $var und dann ziehe ich 1 von $var ab. Wie kann ich das erreichen?

Antwort1

Ihr Skript funktioniert aus mehreren Gründen nicht:

  • Sie beginnen mit der Initialisierung, varsodass sie der Ausgabe der Befehlsausführung entspricht, | wc -mda mystringsie zu diesem Zeitpunkt null ist.
  • Auch wenn es nicht null wäre, würde es versuchen, seinen Inhalt als Befehl auszuführen und diese Ausgabe an zu senden wc.

Sie müssen A.> die Dinge in der richtigen Reihenfolge tun und ii.> die richtigen Dinge tun:

read -p "Type something > " mystring
var="$( wc -m <<< "$foo" )"
echo $(($var-1))

Antwort2

Wenn Sie die Anzahl der Zeichen zählen möchten, die der Benutzer eingegeben hat, jedoch das Zeilenumbruchzeichen nicht mit einbeziehen, sollte es folgendermaßen lauten:

#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}

Wenn Sie das möglicherweise vom Benutzer eingegebene Newline-Zeichen einschließen möchten, gehen Sie wie folgt vor:

#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput && userInput="$userInput
"
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}

readwird in der Regel zurückkehrenWAHRwenn eine vollständige Zeile eingegeben wurde (das Zeilenumbruchzeichen vorhanden ist), weshalb wir bei readErfolg eine anhängen.

Beachten Sie, dass es in den meisten Shell-Implementierungen ( zshmit Ausnahme) nicht richtig funktioniert, wenn der Benutzer ein NUL- ^@Zeichen (auch bekannt als ) eingibt.

Um dies zu umgehen, können Sie Folgendes tun:

printf 'Type text: '
length=$(line | wc -m)

stattdessen. Oder:

length=$(line | tr -d '\n' | wc -m)
# or
length=$(($(line | wc -m) - 1)) # as line always includes a newline on
                                # output even if one was not provided on
                                # input.

wenn Sie die neue Zeile nicht zählen möchten.

Das Verhalten variiert auch, wenn der Benutzer Bytes eingibt, die nicht Teil gültiger Zeichen sind. Sie werden auch einige shImplementierungen finden, die ${#var}mit Mehrbyte-Zeichen nicht richtig funktionieren (würden die Länge in Bytes statt in Zeichen zurückgeben).

Antwort3

expr " $mystring" : '.*' - 1

gibt die Länge des Inhalts der Shell-Variable zurückmystring

Antwort4

In Bash verwenden Sie

#!/usr/bin/env bash

read -p 'Type text: ' userInput
printf 'Your input was %d chars long\n' "${#userInput}"

Die Anzahl der Zeichenketten kann mit abgefragt werden ${#var}. Die Verwendung wcist in diesem Fall nicht erforderlich.

verwandte Informationen