${var}
bash가 중괄호 변수(예: )만 확장 하고 일반 변수(예: )를 무시 하도록 하는 bash 옵션이나 다른 방법이 있습니까 $var
?
업데이트 - 내가 원하는 이유는 다음과 같습니다. 순수 bash에 남아 있어야 하는 상대적으로 큰 프로그램이 순수 bash로 작성되어 있습니다(대부분의 Linux 배포판에서 실행되도록 설계된 설치 프로그램이므로 추가 종속성을 추가하고 싶지 않습니다). Bash로 작성된 매우 간단한 템플릿 엔진이 있습니다. 템플릿 구문 분석 코드는 다음과 같습니다(모두).
function apply_template() {
local src=$1
local dst=$2
local code="
cat<<EOF
$(cat $src)
EOF
"
eval "$code" > $dst
}
매우 간단하지만 매우 효과적입니다. 이 코드로 평가된 템플릿은 30개입니다. 예는 다음과 같습니다.
[ {
"host" : "${primary_node_ip}",
"access" : {
"type" : "ssh",
"user" : "${user}",
"key" : "id_rsa"
} ]
Bash는 변수를 값으로 대체하고 모든 것이 정상입니다.
nginx 구성과 같이 변수로 간주되어서는 안 되는 "$" 기호가 템플릿에 포함되어 있으면 문제가 발생합니다. 실제로 이는 nginx conf라는 하나의 템플릿에서만 발생합니다.
완벽한 해결책은 내 "apply_template" 함수에서 이 모드를 활성화하는 것입니다(지금까지 제가 아는 한 존재하지 않습니다).
답변1
아니요, 거기는 아닙니다. 변수 확장은 매뉴얼에 설명되어 있습니다.3.5.3 쉘 매개변수 확장
'$' 문자는 매개변수 확장, 명령 대체 또는 산술 확장을 소개합니다.확장할 매개변수 이름이나 기호는 중괄호로 묶을 수 있습니다.선택 사항이란 무엇입니까?[...]
정말 이게 필요하다면
- 이유를 설명해 주세요. (XY 문제인 것 같습니다.)
$
식별자 앞의 모든 항목을 이스케이프하고 사이에 구두점을 두지 않도록 bash 코드를 전처리할 수도 있습니다 .
답변2
질문에 표시된 것과 유사한 JSON 템플릿이 있다고 가정해 보겠습니다.
$ cat template
[
{
"host": $primary_node_ip,
"access": {
"type": $access_type,
"user": $user,
"key": $id_rsa
},
"comment": $comment
}
]
쉘 변수처럼 보이는 것은 실제로 jq
JSON 도구의 명령줄에서 값을 할당할 수 있는 내부 변수 입니다 jq
. 이렇게 하면 JSON 문서에 포함하기 위해 값이 적절하게 인코딩됩니다.
jq -n -f template \
--arg primary_node_ip '127.0.0.1' \
--arg access_type SSH \
--arg user "$(id -un)" \
--arg id_rsa "$(cat ~/.ssh/id_rsa.pub)" \
--arg comment "$(cat <<-'END'
Test use only.
Contact "Adam" at [email protected]
for more info.
END
)"
위 명령은 문서에서 사용되는 변수에 값을 할당합니다. 일부 변수에는 변수 값이 할당되고, $comment
변수에는 따옴표가 포함된 여러 줄의 텍스트가 할당됩니다.
이 -n
옵션은 jq
파일 또는 입력 스트림에서 추가 입력 읽기를 중지합니다. 대신 options 를 통해 제공된 템플릿 파일의 표현식 결과를 생성합니다 -f
.
출력(예):
[
{
"host": "127.0.0.1",
"access": {
"type": "SSH",
"user": "myself",
"key": "ssh-rsa AAAAVERYLONGKEY= [email protected]"
},
"comment": "Test use only.\nContact \"Adam\" at [email protected]\nfor more info."
}
]
이 jq
도구는 내가 알고 있는 모든 Linux 배포판은 물론 다른 모든 현재 Unix 변형에서도 작동합니다.