Bekræft længden af en variabel

Jeg har til at verificere længden af den læste variabel (min scriptgrænse til fem indsatte tegn), jeg tænker på noget som dette:

#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi 

er der en mere “elegant” løsning?

Kommentarer

  • Dit script fungerer korrekt i standard POSIX /bin/sh. Du bør overveje at ændre shebang-linjen til #!/bin/sh, så den bliver mere bærbar og kør i miljøer, hvor bash ikke er ' t tilgængelig. Plus, /bin/sh kan være en mere let skal som dash, der ikke er ' t belastet med funktioner beregnet til interaktiv brug.
  • @Celada, sandt dog i dette tilfælde dash ' s ${#string} giver dig længden i antal byte i stedet for tegn.

Svar

M malm elegant? Nej

Kortere? Ja 🙂

#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi 

Og hvis du ikke har noget problem med at handle mere elegance til fordel for at være kortere, kan du have et script med 2 linjer mindre:

#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done" 

Du kan bruge dobbelte parenteser, hvis du synes, det er mere sikkert. Forklaring her .

Svar

Et Bourne-kompatibelt alternativ (${#string} er POSIX men ikke Bourne (ikke at du sandsynligvis nogensinde kommer over en Bourne-skal i disse dage)):

case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac 

Bemærk, at både ${#string} og ????, om det vil være antallet af bytes eller tegn, afhænger af Skallen. Generelt (og det kræves af POSIX) er det antallet af tegn. Men for nogle skaller som dash, der ikke er multi-byte opmærksomme, vil det være bytes i stedet.

Med mksh, du har brug for set -o utf8-mode (i UTF-8-lokaliteter) for at det skal forstå multi-byte-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

  • uden for emnet, men er echo Too long anderledes under emhætten fra echo 'Too long'
  • Og hvis du bare vil udskrive, når den ' s " for lang ", jeg kan komprimere endnu mere på min if mulighed 🙂
  • @StevenPenny, echo Too long sender to argumenter (Too og long) til echo som echo udgange adskilt af et mellemrum (og efterfulgt af en ny linje), mens vi i echo 'Too long' passerer en Too long argument til , som den viser efter en ny linje. Så det svarer til ' s funktionnaly.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *