Vahvista muuttujan pituus

Olen varmentanut muuttujan luetun pituuden (skriptiini rajoittaa viisi lisättyä merkkiä), ajattelen jotain tämä:

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

onko olemassa tyylikkäämpi ratkaisu?

Kommentit

  • Skripti toimii oikein tavallisessa POSIX-versiossa /bin/sh. Harkitse shebang-rivin muuttamista #!/bin/sh, jotta se olisi kannettavampi. ja aja ympäristöissä, joissa bash ei ole ' t käytettävissä. Lisäksi /bin/sh voi olla kevyempi kuori, kuten viiva, joka ei ole ' ei ole täynnä ominaisuuksia, jotka on tarkoitettu interaktiiviseen käyttöön.
  • @Celada, tosin tässä tapauksessa, dash ' s ${#string} antaisi tavujen määrän merkkien sijaan.

Vastaa

M malmi tyylikäs? Ei

Lyhyempi? Kyllä: p>

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

Voit käyttää kaksoissulkeita, jos luulet sen olevan turvallisempaa. Selitys täältä .

Vastaa

Bourne-yhteensopiva Vaihtoehto (${#string} on POSIX, mutta ei Bourne (ei sitä, että olet todennäköisesti koskaan törmännyt Bourne-kuoreen näinä päivinä):

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

Huomaa, että sekä ${#string} että ????, riippuu tavujen vai merkkien lukumäärä Yleensä (ja POSIX vaatii sitä) se on merkkien lukumäärä. Mutta joillekin kuorille, kuten dash, jotka eivät ole monitavuisia, se on tavu.

mksh, tarvitset set -o utf8-mode (UTF-8-kielillä), jotta se ymmärtää monitavuisia merkkejä:

$ 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 

Kommentit

  • aiheen ulkopuolella, mutta on echo Too long hupun alla erilainen kuin echo 'Too long'
  • Ja jos tulostat vain, kun se ' s " liian pitkä ", voin pakata vielä enemmän if -vaihtoehtooni 🙂
  • @StevenPenny, echo Too long välittää kaksi argumenttia (Too ja long) echo joka echo lähdöt erotettu välilyönnillä (ja sen jälkeen uusi rivi), kun taas echo 'Too long', välitämme yhden Too long argumentti jonka se näyttää uudella rivillä. Joten se ' on funktionaalinen vastaavuus.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *