Bekreft lengden på en variabel

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

  • Skriptet ditt fungerer riktig i standard POSIX /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.
  • @Celada, sant men i dette tilfellet dash ' s ${#string} vil gi deg lengden i antall byte i stedet for tegn.

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 fra echo '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 og long) til echo som echo utganger atskilt med mellomrom (og etterfulgt av en ny linje), mens vi i echo 'Too long' passerer en Too long argument til som den viser etter en ny linje. Så det ' s funksjonalitetsekvivalent.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *