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
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ší odecho '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
along
)echo
kterýecho
výstupy oddělené mezerou (a za nimi nový řádek), zatímco vecho 'Too long'
předáme jedenToo long
argument pro který zobrazí za novým řádkem. ' je tedy funkčně ekvivalentní.
/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í.dash
' s${#string}
vám místo znaků poskytne délku v počtu bajtů.