Problem ze skryptem powłoki liczącym znaki

11

Próbuję nauczyć się podstaw i napotkałem problem ze skryptem liczącym znaki wprowadzane przez użytkownika. Oto mój skrypt, czy ktoś może wskazać, gdzie popełniam błąd?

#!/bin/bash

echo "Enter a word!"    
read INPUT_STRING   
len= echo $INPUT_STRING | wc -c 
echo "Your character length is " $len
exit
Jack Slater
źródło

Odpowiedzi:

12

każdy początek jest trudny:

#!/bin/bash
read INPUT
echo $INPUT
len=$(echo -n "$INPUT" | LC_ALL=C.UTF-8 wc -m)
echo $len

w szczególności nie może istnieć przestrzeń =i należy w niej umieścić osobne polecenie $(...). Możesz również chcieć pisać zmienne w cudzysłowach "przy użyciu tej składni "${INPUT}", co gwarantuje, że zmienna nie zostanie przypadkowo powiązana z poniższymi i może zawierać specjalne znaki (np. Znaki nowej linii \n).

Sebastian
źródło
1
Dziękuję, mój kod działa teraz, a dodatkowa pomoc pomoże mi w przyszłości. Dzięki
Jack Slater
@Gnouc Dziękujemy za tę wnikliwą edycję! wciąż się uczę ...
Sebastian,
przepraszam za odniesienie w przyszłości, czy mógłbyś mi powiedzieć, co robi -n, a LC_ALL = C.UTF-8, ponieważ chciałbym wiedzieć o jego celu. Dziękuję
Jack Slater,
1
aby znaleźć sens przełącznik linii poleceń, spróbuj użyć manpolecenia (w tym przypadku man echo: -n do not output trailing newline). Częste wywoływanie manspowoduje szybkie rozwinięcie umiejętności korzystania z systemu Linux. Aby uzyskać więcej informacji LC_ALL, zobacz to pytanie / odpowiedź
Sebastian,
1
kopiuj z linku: zazwyczaj uruchamiasz komendę, LC_ALL=Caby uniknąć zakłócania ustawień użytkownika przez skrypt. Na przykład, jeśli chcesz [a-z]dopasować 26 znaków ASCII od a do z, musisz ustawićLC_ALL=C
Sebastian
8

Myślę, że najlepiej byłoby użyć

len=${#INPUT_STRING}

w przeciwnym razie liczony będzie także znak końca linii dodany przez echo. Chyba że tego właśnie chcesz.

bfloriang
źródło
Zgadzam się, jest krótszy i szybszy.
Franki