다음 인용 스타일 중 적절한 것은 무엇입니까?GNU 구타변수가 선호되는 이유는 무엇입니까?
- 두 개의 큰따옴표:
VAR="/path/$V1/path with space/$V2"
. - 여러 개의 큰따옴표:
VAR=/path/"$V1"/"path with space"/"$V2"
. - 콤비네이션:
VAR="/path/"$V1"/path with space/"$V2""
. - 다른.
여기서 선호되는 의미는 다음과 같습니다.불필요하게 장황하지 않고 가능한 한 많은 경우에 예상대로 작동합니다., 문제없이 꾸준하게 사용할 수 있도록 합니다. (드물게?) 특별한 경우가 있는 경우 파일 시스템 경로로 제한하십시오.
path
섹션에 공백이나 특수 문자가 포함될 수 있다고 가정합니다 . ~을 위한2물론 이는 이러한 path
부분도 인용되어야 함을 의미합니다.
기본적으로 이것은 또 다른 질문으로 귀결되는 것 같습니다.참조 변수 대체만으로도 추가 작업이 수행됩니까?
이것이 사실이라면 감동을 줄 것입니다.2그리고삼(각 섹션을 공백으로 개별적으로 인용하지 않으려면 path
) 그렇지 않다면,1가장 간단해서 선호되는 것 같습니다.
그런데 사례를 찾아보니여기,2지금까지 가장 일반적이지만 특별한 경우는 무엇입니까 VAR="$OTHER_VAR"/path/to/something
?
답변1
주요 내용은 다음과 같습니다.모든 형태의 확장이나 공백이 포함된 문자열은 큰따옴표로 묶습니다., 그렇지 않은 경우에는 다른 방법을 사용할 수 있습니다(예: '언제 큰따옴표가 필요합니까?"). 실제 비트만 참조할지 여부필요따옴표 외부에 공백이 아닌 정적 공백을 인용하고 보존하는 것은 덜 중요합니다.
한 번에 하나씩 옵션을 살펴보겠습니다.
VAR="/path/$V1/path with space/$V2"
이것은 읽기에 가장 쉬운 변형입니다(개인 의견). 모든 변수 확장은 인용되고, 문자열은 공백으로 분할되지 않습니다(인용되기 때문입니다). 저는 이 옵션을 사용하겠습니다.
기억에 남는 유일한 것은Sergiy Kolodyazhny가 댓글에서 지적했습니다., 경로 이름에 실제 리터럴 큰따옴표 문자가 포함된 경우 이를 이스케이프하거나
\"
큰따옴표로 묶인 문자열을 일시적으로 종료하고"
작은따옴표로 묶인 문자열에 를 삽입하여 처리해야 합니다"this is a string with a "'"'" in it"
. 마찬가지로, 셸에 특수한 다른 문자(예:$
and\
및`
)는 큰따옴표로 묶인 문자열에서도 동일하게 처리되어야 합니다. 이는아니요경로 이름 문자열에서 확장되는 변수에 이러한 문자 중 하나가 포함되어 있으면 문제가 발생합니다(올바르게 처리됨).VAR=/path/"$V1"/"path with space"/"$V2"
이 (IMHO)는 약간 지저분해 보이지만 작동합니다. 슬래시 사이의 모든/대부분의 경로 구성 요소를 큰따옴표로 묶습니다. 또 다른 접근 방식은 변수를 확장하지 않고 작은따옴표를 사용하는 것입니다.
VAR=/'path'/"$V1"/'path with space'/"$V2"
두 번째 옵션을 사용할지, 첫 번째 옵션을 사용할지는 귀하와 개인 취향(또는 귀하가 작업 중인 프로젝트에서 팀이 사용하는 규칙)에 달려 있습니다. 단일 규칙을 유지하고 가능하면 두 규칙을 혼합하지 않는 것이 좋습니다.
경로 이름에 쉘 관련 리터럴 문자(작은 따옴표 내에서는 특수 문자가 아님)가 포함될 수 있다는 점을 제외하면 두 가지 "경로 이름을 인용하는 방법" 사이에는 실질적인 차이가 없습니다.사용된 인용문 수.
너도 언급했지
VAR="$OTHER_VAR"/path/to/something
나는 이것에 전혀 문제가 없다고 생각합니다. 나머지 경로가 정적이고 공백을 포함하지 않을 때 가장 많이 사용하는 것입니다. 가지다전혀 차이가 없어요이것과
VAR="$OTHER_VAR/path/to/something"
.
세 번째 옵션:
VAR="/path/"$V1"/path with space/"$V2""
이렇게 하지 마십시오. 사실 여기에는
$V1
아직도$V2
인용되지 않음변수 확장 주위의 큰따옴표 비트를 종료하기 때문입니다.
답변2
여기서 선호되는 것은 불필요하게 장황하지 않고 가능한 한 많은 경우에 예상대로 작동한다는 것을 의미합니다.
그런 다음 첫 번째 것을 사용하십시오. 다른 것에는 원하지 않는 따옴표 문자가 있습니다. 2개만 있으면 됩니다.
$
큰따옴표 안에 특별한 의미가 있는 문자(예 : \
, , "
또는 ) 가 많이 있으면 `
필요한 모든 이스케이프가 보기 흉해집니다. 그러나 파일 이름과 경로에는 이러한 내용이 포함되지 않는 경우가 많습니다.
참조 변수 대체만으로도 추가 작업이 수행됩니까?
아니요, "$foo"bar
와 같은 것을 제외하고는 "${foo}bar"
. 즉, 중괄호 대신 따옴표를 사용하여 변수 이름을 끝낼 수 있습니다. ( "$foobar"
물론 완전히 다르겠죠.)
답변3
첫 번째 옵션이 더 좋아 보이지만 (불행히도?) bash 매뉴얼에 다음과 같이 명확하게 설명되어 있으므로 경로 이름 확장에는 작동하지 않습니다.
다음 형식의 명령문을 사용하여 변수를 할당할 수 있습니다.
name=[value]
모든 값은 물결표 확장, 매개변수 및 변수 확장, 명령 대체, 산술 확장, 따옴표 제거를 거칩니다. (...)
경로 이름 확장은 수행되지 않습니다.
중요한 예는 물결표 확장입니다.
var=~/"path/to/dir" # tilde is expanded to user's home directory
var="~/path/to/dir" # literal string is substituted
흥미롭게도 글로빙 메커니즘은 큰따옴표가 있든 없든 작동합니다 bash
(기본 설정에서는 그렇지 않음 zsh
).