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
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 longhupun alla erilainen kuinecho 'Too long' - Ja jos tulostat vain, kun se ' s " liian pitkä ", voin pakata vielä enemmän
if-vaihtoehtooni 🙂 - @StevenPenny,
echo Too longvälittää kaksi argumenttia (Toojalong)echojokaecholähdöt erotettu välilyönnillä (ja sen jälkeen uusi rivi), kun taasecho 'Too long', välitämme yhdenToo longargumentti jonka se näyttää uudella rivillä. Joten se ' on funktionaalinen vastaavuus.
/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/shvoi olla kevyempi kuori, kuten viiva, joka ei ole ' ei ole täynnä ominaisuuksia, jotka on tarkoitettu interaktiiviseen käyttöön.dash' s${#string}antaisi tavujen määrän merkkien sijaan.