GNU Bash 변수 정의(주로 경로용)에 대한 인용 스타일은 무엇입니까? [폐쇄]

GNU Bash 변수 정의(주로 경로용)에 대한 인용 스타일은 무엇입니까? [폐쇄]

다음 인용 스타일 중 적절한 것은 무엇입니까?GNU 구타변수가 선호되는 이유는 무엇입니까?

  1. 두 개의 큰따옴표: VAR="/path/$V1/path with space/$V2".
  2. 여러 개의 큰따옴표: VAR=/path/"$V1"/"path with space"/"$V2".
  3. 콤비네이션: VAR="/path/"$V1"/path with space/"$V2"".
  4. 다른.

여기서 선호되는 의미는 다음과 같습니다.불필요하게 장황하지 않고 가능한 한 많은 경우에 예상대로 작동합니다., 문제없이 꾸준하게 사용할 수 있도록 합니다. (드물게?) 특별한 경우가 있는 경우 파일 시스템 경로로 제한하십시오.

path섹션에 공백이나 특수 문자가 포함될 수 있다고 가정합니다 . ~을 위한2물론 이는 이러한 path부분도 인용되어야 함을 의미합니다.

기본적으로 이것은 또 다른 질문으로 귀결되는 것 같습니다.참조 변수 대체만으로도 추가 작업이 수행됩니까?

이것이 사실이라면 감동을 줄 것입니다.2그리고(각 섹션을 공백으로 개별적으로 인용하지 않으려면 path) 그렇지 않다면,1가장 간단해서 선호되는 것 같습니다.

그런데 사례를 찾아보니여기,2지금까지 가장 일반적이지만 특별한 경우는 무엇입니까 VAR="$OTHER_VAR"/path/to/something?

답변1

주요 내용은 다음과 같습니다.모든 형태의 확장이나 공백이 포함된 문자열은 큰따옴표로 묶습니다., 그렇지 않은 경우에는 다른 방법을 사용할 수 있습니다(예: '언제 큰따옴표가 필요합니까?"). 실제 비트만 참조할지 여부필요따옴표 외부에 공백이 아닌 정적 공백을 인용하고 보존하는 것은 덜 중요합니다.

한 번에 하나씩 옵션을 살펴보겠습니다.

  1. VAR="/path/$V1/path with space/$V2"

    이것은 읽기에 가장 쉬운 변형입니다(개인 의견). 모든 변수 확장은 인용되고, 문자열은 공백으로 분할되지 않습니다(인용되기 때문입니다). 저는 이 옵션을 사용하겠습니다.

    기억에 남는 유일한 것은Sergiy Kolodyazhny가 댓글에서 지적했습니다., 경로 이름에 실제 리터럴 큰따옴표 문자가 포함된 경우 이를 이스케이프하거나 \"큰따옴표로 묶인 문자열을 일시적으로 종료하고 "작은따옴표로 묶인 문자열에 를 삽입하여 처리해야 합니다 "this is a string with a "'"'" in it". 마찬가지로, 셸에 특수한 다른 문자(예: $and \`)는 큰따옴표로 묶인 문자열에서도 동일하게 처리되어야 합니다. 이는아니요경로 이름 문자열에서 확장되는 변수에 이러한 문자 중 하나가 포함되어 있으면 문제가 발생합니다(올바르게 처리됨).

  2. 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".


세 번째 옵션:

  1. 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).

관련 정보