여러 줄의 변수가 있는데 변수의 첫 번째 줄만 원합니다. 다음 스크립트는 문제를 보여줍니다.
#!/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
지원 됩니다.ksh93
zsh
bash
mksh
sh
또는 최신 버전의 FreeBSD.
아마도 당신은 sh
이 스크립트를 실행하는 대신 사용하려고 할 것이고, bash
당신의 sh
스크립트는 를 기반으로 하고 있거나 ash
아직 pdksh
그 버전을 지원하지 않을 것입니다.yash
ksh88
이 코드가 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"