셸에 중첩된 따옴표

셸에 중첩된 따옴표

다음과 같은 명령을 실행하고 싶습니다.

$ sh -c 'exec python -c "print('$1$2MyString')"'

원하는 결과로 '$1$2MyString'.

그러나 명령을 실행하면 다음과 같은 결과가 나타납니다.

Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'MysString' is not defined

내가 아는 한, 세 번째 수준의 따옴표를 추가하면 실제로 명령이 두 부분으로 분할되고 쉘은 $1$2MyString외부 따옴표를 보고 알려진 값을 바꾸려고 시도합니다.

작은따옴표를 이스케이프 처리하면

$ sh -c 'exec python -c "print(\'$1$2MyString\')"'

다음 오류가 발생합니다.

sh: 1: Syntax error: "(" unexpected

본질적으로 내 질문은: 위의 인쇄 기능에 문자열 리터럴을 도입하는 방법이 있습니까?

답변1

작은따옴표로 묶인 문자열 내에서는 작은따옴표를 이스케이프할 수 없습니다. 예를 들어 다음은 불완전한 줄입니다.

echo 'boy\'s game'    # Wrong!
>

그러나 다양한 유형의 따옴표로 묶인 문자열을 연결할 수 있습니다.

echo "boy's"' game'    # Right
boy's game

따라서 인용문 "'"등을 인용할 수 있습니다.

sh -c 'exec python -c "print('"'"'$1$2MyString'"'"')"'
#     ^-. . . . . . . . . . -^   ^-. . . . . -^   ^--^
#                             ^-^              ^-^

이 출력은 호출을 통해 평가가 수행되기 MyString때문에 발생합니다 . 리터럴로 사용하려면 작은따옴표로 묶어 명시적으로 보호해야 합니다 .$1$2sh$1$2MyStringsh

sh -c 'exec python -c '"'"'print("$1$2MyString")'"'"
#     ^-. . . . . . .-^   ^-. . . . . . . . . .-^

답변2

따옴표는 중첩되지 않습니다(명령 대체 제외). 작은 따옴표로 묶인 문자열 내에서 큰 따옴표는 일반 문자이며 따옴표로 작동하지 않습니다. 그 반대.

Python에 인수를 전달하려는 경우 print('$1$2MyString')필요한 이스케이프를 수행할 수 있지만 문자열에 작은 따옴표와 달러 기호가 모두 포함되어 있기 때문에 어색해집니다. 즉, 더 이상 이스케이프하지 않으면 작은 따옴표와 큰 따옴표 둘 다 사용할 수 없습니다. 문자열 자체에 대해서도 필요한 두 번째 수준의 참조를 고려하는 것은 말할 것도 없습니다.

또는 환경을 통해 문자열을 전달하는 것과 같은 작업을 수행하십시오 sh.

code="print('\$1\$2MyString')"  # or
code='print('\''$1$2MyString'\'')'

code=$code sh -c 'exec python -c "$code"'

또는 출력이 '$1$2MyString'작은 따옴표로 표시되어야 하는 경우 Python 코드는 다음과 같아야 합니다 print("'$1$2MyString'").

code='print("'\''$1$2MyString'\''")'
code=$code sh -c 'exec python -c "$code"'

Python 코드를 파일에 넣는 것이 더 간단할 수도 있습니다.

관련 정보