사용자 입력의 문자 수를 계산하는 다음 스크립트가 있습니다.
echo -n "Type text: ";
read mystring;
echo -n $mystring | wc -m;
마지막 줄에 "-n"이 없으면 echo를 통해 배치된 개행 문자도 포함되므로 문자 수가 잘못됩니다(예를 들어 "abc"의 수가 3이 아닌 4가 됩니다).
연습을 위해 이제 이 수정 작업을 좀 더 복잡한 방식으로 수행하고 싶습니다. 일반적인 아이디어는 다음과 같습니다.
var=$($mystring | wc -m);
echo -n "Type text: ";
read mystring;
echo $(( $var - 1 ));
따라서 사용자가 입력한 문자 수는 $var가 되고, $var에서 1을 뺍니다. 어떻게 작동하게 합니까?
답변1
스크립트가 실행되지 않는 데는 여러 가지 이유가 있습니다.
- 이 시점에서는 null 이므로 먼저
var
실행 중인 명령의 출력과 동일하도록 초기화하세요 .| wc -m
mystring
- 비어 있지 않더라도 내용을 명령으로 실행하고 해당 출력을
wc
.
A> 올바른 순서로 일을 해야 하고, ii.> 올바른 일을 해야 합니다.
read -p "Type something > " mystring
var="$( wc -m <<< "$foo" )"
echo $(($var-1))
답변2
줄 바꿈을 제외하고 사용자가 입력한 문자 수를 계산하려면 다음과 같습니다.
#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}
사용자가 입력할 수 있는 줄바꿈을 포함하려면 다음을 수행하세요.
#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput && userInput="$userInput
"
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}
read
일반적으로 반환진짜전체 줄이 입력되면(개행이 있음) read
성공 시 하나를 추가하는 이유입니다.
대부분의 셸 구현(예외 포함)에서는 zsh
사용자가 NUL(일명 ) 문자를 입력하면 ^@
제대로 작동하지 않습니다 .
이 문제를 해결하려면 다음을 수행할 수 있습니다.
printf 'Type text: '
length=$(line | wc -m)
대신에. 또는:
length=$(line | tr -d '\n' | wc -m)
# or
length=$(($(line | wc -m) - 1)) # as line always includes a newline on
# output even if one was not provided on
# input.
줄 바꿈을 계산하고 싶지 않은 경우.
사용자가 유효한 문자의 일부가 아닌 바이트를 입력하는 경우에도 동작이 달라집니다. 또한 일부 sh
구현에서는 멀티바이트 문자를 올바르게 처리하지 못하는 경우도 있습니다 ${#var}
(문자 길이 대신 바이트 길이를 반환함).
답변3
expr " $mystring" : '.*' - 1
쉘 변수 내용의 길이를 반환합니다.mystring
답변4
Bash에서는 다음을 사용합니다.
#!/usr/bin/env bash
read -p 'Type text: ' userInput
printf 'Your input was %d chars long\n' "${#userInput}"
문자열 개수는 를 통해 검색할 수 있습니다 ${#var}
. wc
이 경우에는 사용할 필요가 없습니다.