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 longanderledes 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
ifmulighed 🙂 - @StevenPenny,
echo Too longsender to argumenter (Toooglong) tilechosomechoudgange adskilt af et mellemrum (og efterfulgt af en ny linje), mens vi iecho 'Too long'passerer enToo longargument 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/shkan 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.