Ověřte délku proměnné

Ověřuji délku čtení proměnné (limit mého skriptu je omezen na pět vložených znaků), myslím na něco jako toto:

#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi 

existuje více „elegantní“ řešení?

Komentáře

  • Váš skript funguje správně ve standardním POSIX /bin/sh. Měli byste zvážit změnu řádku shebang na #!/bin/sh, aby byl přenosnější a běží v prostředích, kde není k dispozici bash ' t. Navíc /bin/sh může být lehčí shell jako dash, který není ' t nabitý funkcemi určenými pro interaktivní použití.
  • @Celada, pravda, i když v tomto případě dash ' s ${#string} vám místo znaků poskytne délku v počtu bajtů.

Odpověď

M nebo elegantní? Ne

Kratší? Ano 🙂

#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi 

A pokud nemáte problém s obchodováním s více elegancí ve prospěch zkrácení, můžete mít skript o 2 řádky méně:

#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done" 

Pokud si myslíte, že je to bezpečnější, můžete použít dvojité závorky. Vysvětlení zde .

Odpověď

Bourne kompatibilní alternativa (${#string} je POSIX, ale ne Bourne (ne že byste dnes pravděpodobně narazili na Bourneovu shell)):

case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac 

Upozorňujeme, že u ${#string} i ???? bude počet bytů nebo znaků záviset na shell. Obecně (a je to vyžadováno POSIXem) je to počet znaků. Ale pro některé skořápky jako dash, které nejsou vícebajtové, budou místo toho použity bajty.

S mksh, abyste porozuměli vícebajtovým znakům, potřebujete set -o utf8-mode (v národních prostředích UTF-8):

$ string=€€€ bash -c "echo "${#string}"" 3 $ string=€€€ dash -c "echo "${#string}"" 9 $ string=€€€ mksh -c "echo "${#string}"" 9 $ string=€€€ mksh -o utf8-mode -c "echo "${#string}"" 3 $ locale charmap UTF-8 

Komentáře

  • mimo téma, ale echo Too long se pod kapotou liší od echo 'Too long'
  • A pokud budete jen tisknout, když je ' s " příliš dlouhý ", mohu ještě více zhutnit svoji if možnost 🙂
  • @StevenPenny, echo Too long předává dva argumenty (Too a long) echo který echo výstupy oddělené mezerou (a za nimi nový řádek), zatímco v echo 'Too long' předáme jeden Too long argument pro který zobrazí za novým řádkem. ' je tedy funkčně ekvivalentní.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *