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 longforskjellig 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 longoverfører to argumenter (Toooglong) tilechosomechoutganger atskilt med mellomrom (og etterfulgt av en ny linje), mens vi iecho 'Too long'passerer enToo longargument til som den viser etter en ny linje. Så det ' s funksjonalitetsekvivalent.
/bin/sh. Du bør vurdere å endre shebang-linjen til#!/bin/shslik at den blir mer bærbar og kjør i miljøer der bash ikke er ' t tilgjengelig. I tillegg kan/bin/shvæ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.