변수의 길이를 확인


27

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

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

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


1
스크립트는 표준 POSIX에서 올바르게 작동합니다 /bin/sh. #!/bin/shbash를 사용할 수없는 환경에서 shebang 라인을 보다 이식 가능하고 실행 가능하도록 변경해야 합니다. 또한 /bin/sh대화 형으로 사용되는 기능이 부담되지 않는 대시와 같은 더 가벼운 쉘 일 수 있습니다.
Celada

@Celada,이 경우 사실 생각은, dash의는 ${#string}당신에게 바이트 문자 대신 수의 길이를 줄 것입니다.
Stéphane Chazelas

답변:


43

더 우아한? 아니

더 짧습니까? 예 :)

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

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


3

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

주제 echo Too longecho 'Too long'
Steven Penny

그리고 "너무 길다"고 인쇄 할 경우 if옵션으로 더 많이 압축 할 수 있습니다. :)

2
@StevenPenny은 echo Too long두 인수 (통과 Too하고 long까지) echo되는 echo중에, 출력은 공간으로 분리 (개행 하였다)을 echo 'Too long', 우리는 하나 개의 전달 Too long에 인수 echo는 개행 다음을 표시하는. 따라서 기능적으로 동일합니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.