저는 이제 막 Bash를 배우기 시작했기 때문에 다음 질문이 너무 기본적으로 보일 수 있다는 점 사과드립니다.
쉘 스크립트에서 따옴표 사용을 이해하는 데 문제가 있습니다.
내가 쓰고 싶다면
a="file"
b="`grep " a" "$a"`"
echo $b
"$a" 및 "a"를 따옴표 "`grep " a" "$a"`"로 읽어야 합니까?
아니면 왼쪽에서 오른쪽으로 읽히나요?
변수를 큰따옴표로 묶는 법을 배웠기 때문입니다.
나를 더욱 혼란스럽게 만드는 것은 선생님이 시스템이 변수 이름과 그 뒤의 텍스트를 오해하는 것을 방지하기 위해 변수 이름 주위에 또 다른 큰따옴표를 추가해야 한다고 말씀하셨다는 것입니다.
중첩된 따옴표는 무엇을 합니까? 언제 따옴표를 사용해야 할까요?
답변1
일반 따옴표는 중첩될 수 없지만 백틱은 큰따옴표에서 특별합니다.
$()
백틱 대신 이것을 사용하는 것이 더 읽기 쉽고 간결합니다. 그들은 모두 의미명령 대체즉, 포함된 명령의 출력으로 확장됩니다.
b="$(grep " a" "$a")"
그러나 할당에 외부 큰따옴표를 사용할 필요는 없으므로 다음은 동일합니다.
b=$(grep " a" "$a")
귀하의 질문이 변경되었으므로 더 자세한 내용을 추가해 보겠습니다. 단어 분리를 방지하려면 어디든 큰따옴표를 사용해야 합니다. 변수 이름의 문제는 다음에서 가장 잘 설명됩니다.
echo "$var1_$var2" # two variables, $var1_ and $var2
echo "$var1"_"$var2" # two variables, $var1 and $var2, separated by an underscore
# also possible:
echo "${var1}_$var2"
답변2
백틱을 사용하여 고대 형태의 명령 대체를 사용하고 있으므로 대답은 "상황에 따라 다릅니다"입니다. 일부 쉘(예: Bash)은 백틱을 사용하여 새 인용 컨텍스트를 시작하므로 내부 큰따옴표 쌍은 백틱과 외부 큰따옴표 내에 중첩되어 다음과 같은 네 개의 인용 부분으로 끝납니다.
b="`grep " a" "$a"`"
# c--c d--d
# b--------------b
# a----------------a
하지만... 일부 다른 쉘(ksh)은 중간에 있는 백틱에 관계없이 두 번째 큰따옴표가 큰따옴표로 묶인 문자열을 끝내도록 이를 구문 분석합니다. 결과는 다음과 같습니다.
b="`grep " a" "$a"`"
# a------a b-b c-c
이렇게 하면 원하는 효과를 얻을 수 없습니다. ( 를 실행 grep ''
하고 출력을 에 할당한 b
다음 a
주어진 인수를 빈 명령으로 대체하여 실행합니다.)
바라보다:ksh의 역따옴표 안의 따옴표
당연히 POSIX는 이러한 상황을 정의하지 않습니다.
즉, 명령 대체를 사용하는 형식으로 변경하려는 경우 $(...)
이를 방지할 수 있으며, 이 경우 확장은 항상 새로운 인용 컨텍스트를 시작하므로 큰따옴표 안에 중첩되고 큰따옴표 내에는 중첩 $(...)
.
b="$(grep " a" "$a")"
# c--c d--d
# b--------------b
# a-----------------a
바라보다:
친구는 백틱을 사용하는 것을 허용하지 않습니다.
나를 더욱 혼란스럽게 만드는 것은 선생님이 시스템이 변수 이름과 그 뒤의 텍스트를 오해하는 것을 방지하기 위해 변수 이름 주위에 또 다른 큰따옴표를 추가해야 한다고 말씀하셨다는 것입니다.
따옴표를 사용하거나 변수 이름을 중괄호로 묶어 이를 수행할 수 있습니다. 따라서 세 가지 변형 모두에서 다음은 $foo
고정 문자열로 확장되고 추가됩니다 bar
.
$ foo=xxx
$ echo "$foo""bar" "$foo"bar "${foo}bar"
xxxbar xxxbar xxxbar
마지막 것이 아마도 가장 읽기 쉬울 것입니다.
중첩된 따옴표는 무엇을 합니까? 언제 따옴표를 사용해야 할까요?
위에서 언급했듯이 명령 대체와 같은 것이 없으면 따옴표가 서로 중첩되지 않습니다. 하나도 없으면 비슷한 따옴표는 따옴표로 끝나지만 다른 따옴표는 일반 문자처럼 작동하고 아무 것도 인용하지 않습니다.
예를 들어, 다음은 중간에 인용되지 않은 부분이 있는 두 개의 인용 문자열입니다.
"foo "abc def" bar"
# <----> <---->
# ^ unquoted space.
이것은 정확히 하나의 작은따옴표 문자를 포함하는 따옴표 붙은 문자열입니다.
$ echo "foo 'abc def' bar"
foo 'abc def' bar
echo
작은따옴표는 문자 및 공백과 마찬가지로 명령줄 인수의 일부로 전달됩니다. 그들은 아무것도 인용하지 않습니다.
언제인지는 다음을 참조하세요.언제 큰따옴표가 필요합니까?