변수 읽기 길이를 확인했습니다 (내 스크립트는 삽입 된 문자 5 개로 제한). this :
#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi
더 “우아한”솔루션이 있습니까?
댓글
Answer
M 우아한 광석? 아니요
짧으세요? 예 🙂
#!/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
와 같은 일부 셸의 경우 대신 바이트가됩니다.
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
댓글
- 주제에서 벗어 났지만
echo 'Too long'
div와는echo Too long
내부적으로 다릅니다. > - 그리고 '의 " 너무 긴 ,
if
옵션에서 더 많이 압축 할 수 있습니다. 🙂 - @StevenPenny,
echo Too long
는 두 개의 인수 (Too
및long
)를echo
에 전달합니다. e79242ecd5 “>
출력은 공백 (및 줄 바꿈)으로 구분 된 반면 echo 'Too long'
에서는 Too long
하나를 전달합니다. 다음 줄 바꿈으로 표시됩니다. 따라서 ' 기능적으로 동일합니다.
/bin/sh
에서 올바르게 작동합니다. 이동성을 높이려면 shebang 줄을#!/bin/sh
로 변경하는 것이 좋습니다. bash를 사용할 수없는 ' 환경에서 실행됩니다. 또한/bin/sh
는 대시와 같은 더 가벼운 쉘일 수 있지만 ' 대화식 사용을위한 기능에 부담을주지 않습니다.dash
'의${#string}
는 문자 대신 바이트 수로 길이를 제공합니다.