문자 계산 연습(bash)

문자 계산 연습(bash)

사용자 입력의 문자 수를 계산하는 다음 스크립트가 있습니다.

    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 -mmystring
  • 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이 경우에는 사용이 불필요합니다

관련 정보