.png)
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,
var
sodass sie der Ausgabe der Befehlsausführung entspricht,| wc -m
damystring
sie 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}
read
wird in der Regel zurückkehrenWAHRwenn eine vollständige Zeile eingegeben wurde (das Zeilenumbruchzeichen vorhanden ist), weshalb wir bei read
Erfolg eine anhängen.
Beachten Sie, dass es in den meisten Shell-Implementierungen ( zsh
mit 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 sh
Implementierungen 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 wc
ist in diesem Fall nicht erforderlich.