일반적으로 여러 줄이 포함된 텍스트 파일이 있고 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