Bash의 내장 명령을 사용하여 '\n'을 변수로 어떻게 읽나요?

Bash의 내장 명령을 사용하여 '\n'을 변수로 어떻게 읽나요?

read어떻게 든 후행 기호를 변수 \n에 넣을 수 없습니다 . 어떤 경우든 다른 문자가 없을 때 한 문자만 에코하여 빈 줄이 발생하는 것을 REPLY방지하고 싶습니다 . \n반면:readecho

declare -l REPLY
read >&2 -r -N 1 -p "Acknowledged? (y):" REPLY
if [[ "$REPLY" != $'\n' ]]; then
  echo >&2
fi

나에게 가능한 해결 방법은 입력을 read억제()하는 것이었습니다. -s그러나 이상적으로는 사용자가 프롬프트 다음에 입력한 단일 문자를 볼 수 있어야 합니다.

또한 변수에 문자를 넣을 IFS= read -d''수도 없습니다 \n.

어떤 아이디어가 있나요?

답변1

FWIW, 귀하의 코드가 저에게 효과적입니다.

$ echo | bash -c 'read -rN1; echo "$BASH_VERSION <$REPLY>"'
4.2.36(1)-release <
>

사용하면 -N설정이 필요하지 않으며 IFSNL은 결국 $REPLY에 표시됩니다. NULL은 $REPLY단지 NUL( <Ctrl-Space>), EOF 또는 오류를 의미합니다(두 경우 모두 종료 상태는 0이 아님).

답변2

Read는 \n레코드 구분 기호로 사용되므로 로 끝나지 않습니다 $REPLY. echo확인하려는 경우에는 .오직줄(즉, 빈 줄)에 개행 문자가 있는 경우 다음 테스트 중 하나가 작동합니다.

[[ $REPLY == "" ]] # true if line is empty
(( ${#REPLY} )) # true if line is not empty

read를 사용하여 호출하지 않으므로 IFS=공백만 포함된 입력과도 일치합니다.

답변3

Chris가 언급했듯이 구분 기호이지만 문자열 길이를 확인하려면 다음을 수행하십시오.

if [ -z "$REPLY" -o "$REPLY" == "y" ]; then
    echo "It was acknowledged"
else
    echo "Not acknowledged"
    exit 1
fi

관련 정보