Я должен проверить длину чтения переменной (мой сценарий ограничен пятью вставленными символами), я думаю о чем-то вроде этого:
#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
Есть ли более "элегантное" решение?
/bin/sh
. Вам следует подумать об изменении строки shebang,#!/bin/sh
чтобы она была более переносимой и работала в средах, где bash недоступен. Кроме того, это/bin/sh
может быть более легкая оболочка, такая как dash, которая не обременена функциями, предназначенными для интерактивного использования.dash
«s${#string}
даст вам длину в байтах , а не символы.Ответы:
Более элегантно? нет
Более короткие? Да :)
И если у вас нет проблем с тем, чтобы торговать более элегантно в пользу того, чтобы быть короче, у вас может быть скрипт на 2 строки меньше
Вы можете использовать двойные скобки, если считаете, что это безопаснее. Объяснение здесь .
источник
Bourne-совместимая альтернатива (
${#string}
это POSIX, но не Bourne (не то, чтобы вы когда-нибудь встречали оболочку Bourne в наши дни)):Обратите внимание, что для обоих
${#string}
и????
того, будет ли это число байтов или символов, будет зависеть от оболочки. Как правило (и это требуется POSIX), это количество символов. Но для некоторых таких оболочек, какdash
это не многобайтовый, вместо этого будут байты.С помощью
mksh
вамset -o utf8-mode
(в локалях UTF-8) нужно понимать многобайтовые символы:источник
echo Too long
отличается под капотом отecho 'Too long'
if
echo Too long
передает два аргумента (Too
иlong
), кecho
которым выводятся,echo
разделенные пробелом (и сопровождаемый символом новой строки), в то время как вecho 'Too long'
, мы передаем одинToo long
аргумент,echo
которому он отображает после новой строки. Так что это функционально эквивалентно.