Ellenőrizze a változó hosszát

Ellenőriztem a változó olvasási hosszát (a szkript korlátozva van a beillesztett öt karakterre), valami ilyesmire gondolok ez:

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

létezik “elegánsabb” megoldás?

Megjegyzések

  • A szkript megfelelően működik a normál POSIX rendszerben /bin/sh. Fontolja meg a shebang sor megváltoztatását #!/bin/sh, hogy jobban hordozható legyen és olyan környezetben futtasson, ahol a bash nem ' t érhető el. Ráadásul a /bin/sh lehet, hogy egy könnyebb héj, például kötőjel, amely nem “bf939ae919″>

nincs interaktív használatra szánt funkciókkal terhelve.

  • @Celada, igaz ebben az esetben, dash ' s ${#string} karakterek helyett megadná a bájtok számát.
  • Válasz

    M érc elegáns? Nem

    Rövidebb? Igen 🙂

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

    És ha nincs problémája nagyobb eleganciával kereskedni az alacsonyabbság mellett, akkor 2 sorral kevesebb szkriptet használhat:

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

    Használhat dupla zárójelet, ha úgy gondolja, hogy biztonságosabb. Magyarázat itt .

    Válasz

    Bourne-kompatibilis alternatíva (${#string} a POSIX, de nem Bourne (nem az, hogy manapság valószínűleg valaha is találkozna egy Bourne-héjjal):

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

    Ne feledje, hogy mind a ${#string}, mind a ???? esetében attól függ, hogy a bájtok vagy a karakterek száma lesz-e. A shell. Általában (és ezt a POSIX előírja) a karakterek száma. De néhány olyan kagylóhoz, mint például a dash, amelyek nem tudnak több bájtról, helyette bájtok lesznek.

    mksh, szükséged van set -o utf8-mode -re (UTF-8 nyelveken), hogy megértsd a többbájtos karaktereket:

    $ 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 

    Megjegyzések

    • nem a téma, de echo Too long eltér a motorháztető alatt a echo 'Too long'
    • És ha csak akkor nyomtat, amikor ' s " túl hosszú ", még jobban tömöríthetem a if opciómat 🙂
    • @StevenPenny, echo Too long két argumentumot (Too és long) ad át echo amely echo kimenetek szóközzel elválasztva (és új sorral), míg az echo 'Too long' mezőben egy Too long argumentum a amelyet új sorral követve jelenít meg. Tehát ' a funkcionális megfelelője.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük