Необходимо смочь сделать это.
ls -l
, если относится символьная ссылка, даст одну строку вывода с истинным путем как заключительное поле.Это достаточно, чтобы Вы обнаружили местоположение источника. Конечно, это могло бы быть символьной ссылкой, которая потребует, чтобы Вы сделали это рекурсивно...
Более элегантно? Нет
Короче? Да :)
#!/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.
Альтернатива, совместимая с 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