Jag ”har för att verifiera längden på den variabel som lästs (min skriptgräns till fem inlagda tecken), jag tänker på något liknande detta:
#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi
finns det en mer ”elegant” lösning?
Kommentarer
Svar
M. malm elegant? Nej
Kortare? Ja 🙂
#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi
Och om du inte har några problem med att handla mer elegans till förmån för att bli kortare, kan du ha ett skript med två rader mindre:
#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done"
Du kan använda dubbla parenteser om du tycker att det är säkrare. Förklaring här .
Svar
Ett Bourne-kompatibelt alternativ (${#string}
är POSIX men inte Bourne (inte att du troligtvis kommer att stöta på ett Bourne-skal idag)):
case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac
Observera att både ${#string}
och ????
beror på om det kommer att vara antalet byte eller tecken i allmänhet (och det krävs av POSIX) är det antalet tecken. Men för vissa skal som dash
som inte är medveten om flera byte kommer det att vara byte istället.
Med mksh
, du behöver set -o utf8-mode
(på UTF-8-platser) för att den ska kunna förstå flerbyte-tecken:
$ 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
Kommentarer
- utanför ämnet, men är
echo Too long
annorlunda under huven frånecho 'Too long'
- Och om du bara skriver ut när den ' s " för lång ", jag kan komprimera ännu mer på mitt
if
-alternativ 🙂 - @StevenPenny,
echo Too long
skickar två argument (Too
ochlong
) tillecho
vilketecho
utgångar åtskilda av ett mellanslag (och följt av en ny rad), medan vi iecho 'Too long'
passerar enToo long
argument till som den visar efter en ny rad. Så det ' s motsvarande funktion.
/bin/sh
. Du bör överväga att ändra shebang-raden till#!/bin/sh
så att den blir mer bärbar och kör i miljöer där bash inte finns ' t tillgängligt. Plus,/bin/sh
kan vara ett lättare skal som streck som inte är ' t belastad med funktioner avsedda för interaktiv användning.dash
' s${#string}
ger dig längden i antal byte istället för tecken.