Jeg har for å bekrefte lengden på variabelen som er lest (skriptgrensen min til fem tegnene som er satt inn), jeg tenker på noe sånt som dette:
#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi
er det en mer «elegant» løsning?
Kommentarer
Svar
M malm elegant? Nei
Kortere? Ja 🙂
#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi
Og hvis du ikke har noe problem med å handle mer eleganse til fordel for å bli kortere, kan du ha et skript med to linjer mindre:
#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done"
Du kan bruke doble parenteser hvis du synes det er tryggere. Forklaring her .
Svar
Et Bourne-kompatibelt alternativ (${#string}
er POSIX, men ikke Bourne (ikke at du sannsynligvis noen gang kommer over et Bourne-skall i disse dager)):
case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac
Merk at for både ${#string}
og ????
, vil det avhenge av om det vil være antall byte eller tegn. skallet. Vanligvis (og det kreves av POSIX), er det antall tegn. Men for noen skjell som dash
som ikke er multi-byte klar, vil det være byte i stedet.
Med mksh
, du trenger set -o utf8-mode
(i UTF-8-lokaler) for at den skal forstå flerbyte-tegn:
$ 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
- utenfor emnet, men er
echo Too long
forskjellig under panseret fraecho 'Too long'
- Og hvis du bare skriver ut når den ' s " for lang ", jeg kan komprimere enda mer på
if
-alternativet 🙂 - @StevenPenny,
echo Too long
overfører to argumenter (Too
oglong
) tilecho
somecho
utganger atskilt med mellomrom (og etterfulgt av en ny linje), mens vi iecho 'Too long'
passerer enToo long
argument til som den viser etter en ny linje. Så det ' s funksjonalitetsekvivalent.
/bin/sh
. Du bør vurdere å endre shebang-linjen til#!/bin/sh
slik at den blir mer bærbar og kjør i miljøer der bash ikke er ' t tilgjengelig. I tillegg kan/bin/sh
være et mer lett skall som dashbord som ikke er ' t belastet med funksjoner ment for interaktiv bruk.dash
' s${#string}
vil gi deg lengden i antall byte i stedet for tegn.