변수의 길이를 확인 같이 생각합니다. #!/bin/bash read string check=${#string} echo $check if [ $check -ge

변수 읽기의 길이를 확인했습니다 (스크립트 문자가 5 자로 제한됨). 다음과 같이 생각합니다.

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

더 “우아한”솔루션이 있습니까?



답변

더 우아한? 아니

더 짧습니까? 예 🙂

#!/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"

더 안전하다고 생각되면 이중 괄호를 사용할 수 있습니다. 여기에 설명하십시오 .


답변

Bourne 호환 대안 ( ${#string}POSIX는 아니지만 Bourne은 아닙니다 (요즘 Bourne 쉘을 발견 할 가능성은 없음)) :

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

${#string}및 모두 ????바이트 수 또는 문자 수인지 여부는 쉘에 따라 다릅니다. 일반적으로 (및 POSIX에 필요) 문자 수입니다. 그러나 이와 같은 일부 쉘의 dash경우 멀티 바이트를 인식하지 못하면 대신 바이트가됩니다.

을 사용하면 멀티 바이트 문자를 이해하기 위해 UTF-8 로켈 mksh이 필요 set -o utf8-mode합니다.

$ 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