다음과 같은 명령을 실행하고 싶습니다.
$ 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$2
sh
$1$2MyString
sh
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 코드를 파일에 넣는 것이 더 간단할 수도 있습니다.