문자 계산 연습(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
  • 비어 있지 않더라도 내용을 명령으로 실행하고 해당 출력을 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이 경우에는 사용할 필요가 없습니다.

관련 정보