.png)
사용자 입력의 문자 수를 계산하는 다음 스크립트가 있습니다.
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
- null이 아니더라도 내용을 명령으로 실행하고 해당 출력을
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
이 경우에는 사용이 불필요합니다