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 long
hupun alla erilainen kuinecho '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
jalong
)echo
jokaecho
lähdöt erotettu välilyönnillä (ja sen jälkeen uusi rivi), kun taasecho 'Too long'
, välitämme yhdenToo long
argumentti 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/sh
voi 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.