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
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 fraecho '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
oglong
) tilecho
somecho
udgange adskilt af et mellemrum (og efterfulgt af en ny linje), mens vi iecho 'Too long'
passerer enToo long
argument til , som den viser efter en ny linje. Så det svarer til ' s funktionnaly.
/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.dash
' s${#string}
giver dig længden i antal byte i stedet for tegn.