bash: 변수의 첫 번째 줄을 변수에 할당

bash: 변수의 첫 번째 줄을 변수에 할당

여러 줄의 변수가 있는데 변수의 첫 번째 줄만 원합니다. 다음 스크립트는 문제를 보여줍니다.

#!/bin/bash

STRINGTEST="Onlygetthefirstline
butnotthesecond
orthethird"

echo "  Take the first line and send to standard output:"
echo ${STRINGTEST%%$'\n'*}
#   Output is as follows:
# Onlygetthefirstline

echo "  Set the value of the variable to the first line of the variable:"
STRINGTEST=${STRINGTEST%%$'\n'*}

echo "  Send the modified variable to standard output:"
echo $STRINGTEST
#   Output is as follows:
# Onlygetthefirstline butnotthesecond orthethird

질문: ${STRINGTEST%%$'\n'*}command 뒤에 배치하면 첫 번째 줄을 반환 echo하지만 할당 뒤에 배치하면 개행을 공백으로 바꾸는 이유는 무엇입니까?

답변1

아마도 가장 효율적이지는 않지만 라이너가 하나만 있는 것 같습니다.

firstLine=`echo "${multiLineVariable}" | head -1`

답변2

어쩌면 하고 싶은 일을 보관하는 다른 방법이 있을 수도 있지만 이 방법이 효과적입니다.

#!/bin/bash

STRINGTEST="
Onlygetthefirstline
butnotthesecond
orthethird
"

STRINGTEST=(${STRINGTEST[@]})
echo "${STRINGTEST[0]}"

답변3

이 코드는 2.05b에서 4.3 사이에서 시도한 모든 bash 버전에서 작동합니다. $'...'인용된 형식을 지원하지 않는 다른 셸을 사용하여 스크립트를 실행 하려고 할 가능성이 높습니다 .

구문 $'...'은 아직 표준이 아니며 최신 버전의 (해당 원본)에서만 sh지원 됩니다.ksh93zshbashmkshsh또는 최신 버전의 FreeBSD.

아마도 당신은 sh이 스크립트를 실행하는 대신 사용하려고 할 것이고, bash당신의 sh스크립트는 를 기반으로 하고 있거나 ash아직 pdksh그 버전을 지원하지 않을 것입니다.yashksh88

이 코드가 POSIX 2008과 호환되도록 하려면 다음과 같이 작성해야 합니다.

STRINGTEST="Onlygetthefirstline
butnotthesecond
orthethird"

NL='
'
STRINGTEST=${STRINGTEST%%"$NL"*}
printf '%s\n' "$STRINGTEST"

그런 다음 POSIX 호환 셸 bash(예: sh.

(목록 컨텍스트에서 인용되지 않은 변수는 Bourne과 같은 쉘에서 매우 특별한 의미를 갖는다는 것을 기억하십시오).

답변4

여기에서 Bash 내장 기능 read과 문자열을 사용하세요.

#!/usr/bin/env bash

STRINGTEST="
Some Text 1
Some Text 2
Some Text 3"


IFS=$'\n' read -r STRINGTEST <<<"$STRINGTEST"

POSIX 매개변수 확장을 사용합니다.

#!/usr/bin/env sh

STRINGTEST="
Some Text 1
Some Text 2
Some Text 3"

# Disables globing
set -f

# Field separator is newline only
IFS="
"

# No quotes, split lines as arguments because of IFS
set -- $STRINGTEST

# First argument is first line
STRINGTEST="$1"

관련 정보