쉘 스크립트를 사용하여 문자열에서 읽은 변수 해석

쉘 스크립트를 사용하여 문자열에서 읽은 변수 해석

일반적으로 여러 줄이 포함된 텍스트 파일이 있고 while 루프를 사용하여 줄을 "인쇄"하고 싶습니다. 이 파일 내의 텍스트에는 변수가 포함되어 있습니다. 문제는 이러한 변수가 스크립트 내에 저장된 변수를 포함하는 유사한 테스트 문자열과 다르게 해석된다는 것입니다. 내 외부 파일에서도 이러한 변수를 해석할 수 있습니까? 아니면 미리 구문 분석해야 합니까? $LINE_INSIDE이들그리고 그리고 의 차이점은 무엇인가요 $LINE_OUTSIDE? 따옴표가 있는 다른 구조 와 같은 다른 질문에서 몇 가지 제안을 시도했지만 ${!varialbe_name}지금까지는 운이 없습니다.

    #!/bin/bash
    # color.sh
    BLUE='\033[1;34m'
    NC='\033[0m' # No Color

    LINE_INSIDE="${BLUE}Blue Text${NC}"
    echo -e ${LINE_INSIDE}

    while read LINE_OUTSIDE; do
            echo -e ${LINE_OUTSIDE}
    done < text_file

산출:

스크립트 출력

추가 정보: 입력 텍스트 파일에 실행하면 안 되는 쉘 명령도 있습니다. 변수만 확장해야 합니다.

답변1

다음과 같이 작성하는 것이 더 합리적일 수 있습니다.

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color

eval "cat << EOF
$(<text_file)
EOF
"

while read루프를 사용하는 것보다 (그런데, 이것은 줄을 읽는 올바른 구문이 아닙니다.).

물론 이는 그 안의 코드가 해석된다는 의미입니다. 예를 들어, 거기에 있는 A는 $(reboot)재부팅을 유발하지만 이는 사용자가 요구하는 것과 다소 차이가 있습니다.

또한 행이 포함되어 있지 text_file않다고 가정합니다 EOF.

또 다른 접근 방식은오직gettext변수(환경 변수) 대체(예: 명령 대체 아님)를 수행하면 GNU 의 다음 이 사용됩니다 envsubst.

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst < text_file

아니면 다음 두 변수를 확장하세요.

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst '$BLUE$NC' < text_file

답변2

최신 버전 bash(버전 4.4부터 시작)에는 완전히 수행할 필요 없이 문자열의 변수를 간접적으로 확장하는 또 다른 영리한 방법이 있습니다 eval.@P힌트, 변수 대체를 포함하되 이에 국한되지 않음).

$ cat file.txt
${BLUE}hello blue${NORM}

$ BLUE=$'\e[34m'
$ NORM=$'\e[m'
$ while IFS= read -r line; do printf '%s\n' "${line@P}"; done < file.txt
hello blue

관련 정보