파일 이름에 변수를 사용하는 방법은 무엇입니까?

파일 이름에 변수를 사용하는 방법은 무엇입니까?

파일 이름에 변수를 올바르게 사용하는 방법은 무엇입니까? 이것이 내가 하는 일인데 밑줄에 뭔가 문제가 있는 것 같습니다.

domain="example"
sub="foo"

if [ -f /opt/nginx/conf.d/com_$domain_$sub.conf ]
  cat <<EOF > /opt/nginx/conf.d/com_$domain_$sub.conf
some multiline
content
EOF
fi

답변1

이 경우 Bash는 이를 domain_확장할 변수의 이름으로 해석합니다. 이는 변수의 유효한 이름입니다. 이 이름을 확장하는 것은 원하는 것이 아닙니다. 이름이 끝날 것으로 예상되는 위치를 Bash에 알려야 합니다. ${}이 경우에는 다음과 같이 하십시오 ${domain}.

/opt/nginx/conf.d/com_${domain}_${sub}.conf

여기서는 오해할 여지가 없더라도 사용하고 있습니다(셸 변수 이름에는 허용되지 않기 때문입니다 ${sub}) . 필요 하지 않은 곳에 사용해도 괜찮다는 점을 보여드리고 싶습니다.$sub.conf.${}

이 변수는 쉘이 이를 이름으로 처리할 때 domain_빈 문자열로 확장됩니다 . 변수는 선언되지 않았지만 공식적으로는 성공적으로 확장되었습니다. 설정되지 않은 변수를 사용하는 것은 일반적으로 오류가 아닙니다. Invoke set -u및 Bash는 설정되지 않은 변수를 오류로 처리합니다( set +u필요한 경우 복구합니다).

설정되지 않은 변수를 오류로 처리하는 것은 디버깅에 유용할 뿐만 아니라 방어적인 스크립팅에도 유용합니다. 설정되지 않은 변수를 의도적으로 허용하지 않는 한, 잘못된 값을 계속 사용하는 것보다 설정되지 않은 변수를 확장하려고 할 때 스크립트가 즉시 실패하는 것이 일반적으로 더 좋습니다. 변수를 사용하여 경로 이름을 지정할 때 "잘못된 값"은 "잘못된 파일을 덮어쓰거나 삭제함"을 의미할 수 있습니다.

반품정확하게 인용하는 것을 잊지 마세요. 예제의 값은 인용되지 않은 경우 안전하지만 사용자 정의 인용은 여전히 ​​괜찮습니다. IMO 인용 없이 할 수 있다면 매번 분석하는 것보다 습관적으로 인용하는 것이 더 쉽고 오류 발생 가능성도 적습니다.

if [ -f "/opt/nginx/conf.d/com_${domain}_$sub.conf" ]

관련 정보