Проверьте длину переменной

Необходимо смочь сделать это.

  • Параметр за 0$ расширяется до полного пути (включая имя) сценария, поскольку это было вызвано.
  • Встроенный тест функции оболочки (или []) может протестировать, если путь является символьной ссылкой с помощью-L
  • ls -l, если относится символьная ссылка, даст одну строку вывода с истинным путем как заключительное поле.

Это достаточно, чтобы Вы обнаружили местоположение источника. Конечно, это могло бы быть символьной ссылкой, которая потребует, чтобы Вы сделали это рекурсивно...

30
18.07.2014, 01:10
2 ответа

Более элегантно? Нет

Короче? Да :)

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

И если у вас нет проблем в торговле более элегантный в пользу того, чтобы быть короче, вы можете иметь скрипт на 2 строки меньше:

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

Вы можете использовать двойные скобки, если вы думаете, что это безопаснее. Explanation here.

44
27.01.2020, 19:38

Альтернатива, совместимая с Bourne (${#string} — это POSIX, но не Bourne (вряд ли вы когда-нибудь столкнетесь с оболочкой Bourne в наши дни)):

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

Обратите внимание, что for как ${#string}, так и ????, будет ли это количество байтов или символов, зависит от оболочки. Как правило (и это требуется POSIX), это количество символов. Но для некоторых оболочек, таких как dash, которые не поддерживают многобайтность, это будут байты.

С mksh вам нужно set -o utf8-mode (в локалях UTF-8), чтобы он понимал многобайтовые символы:

$ 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
3
27.01.2020, 19:38

Теги

Похожие вопросы