programing

파라미터의 큰따옴표 이스케이프

goodcopy 2023. 4. 8. 11:28
반응형

파라미터의 큰따옴표 이스케이프

에서는 Unix를 실행할 수 .myscript '"test"'그리고 저는"test".

in 。cmd'test'.

이중 따옴표를 매개 변수로 전달하려면 어떻게 해야 합니까?은 ''에서 싶습니다.cmd프로그램을 테스트하기 위해 프로그램을 작성할 필요가 없습니다.

인용구를 피하는 또 다른 방법(아마도 바람직하지 않을 수도 있음)은 여러 개의 큰따옴표를 사용하는 것입니다.다른 사람의 코드를 읽기 쉽게 하기 위해, 내가 설명해줄게.

기본 규칙은 다음과 같습니다.

  1. 큰따옴표로 둘러싸인 그룹이 아닌 경우 공백은 다음 파라미터를 구분합니다.
    program param1 param2 param 3는 4개의 를 4개의 파라미터로 합니다.program.exe:
         param1,param2,param , , , , 입니다.3.
  2. 큰따옴표로 둘러싸인 그룹은 프로그램에 파라미터를 전달할 때 값을 구분하는 공백은 무시합니다.
    program one two "three and more"는 3개의 를 3개의 파라미터로 합니다.program.exe:
         one,two , , , , 입니다.three and more.
  3. 다음으로 혼란을 설명하겠습니다.
  4. 큰따옴표로 둘러싸지 않은 텍스트 바로 옆에 있는 큰따옴표 그룹은 다음 하나의 파라미터에 결합됩니다.
    hello"to the entire"world는 1개의합니다.helloto the entireworld.
  5. 주의: 이전 규칙에서는 두 개의 큰따옴표로 둘러싸인 그룹이 서로 바로 옆에 표시될 수 있음을 의미하지 않습니다.
  6. 닫는 따옴표 바로 에 있는 큰따옴표는 이중따옴표 그룹에 인접한 래핑되지 않은 일반 텍스트로 취급되지만, 이중따옴표는 1개뿐입니다.
    "Tim says, ""Hi!"""합니다.Tim says, "Hi!"

따라서 이중 따옴표에는 여는 따옴표, 닫는 따옴표, 일반 텍스트로 작동하는 따옴표 등 세 가지 유형이 있습니다.
마지막 혼란스러운 줄의 내역은 다음과 같습니다.

개방 이중 계층 그룹T inside "s"i는 "s의 내부입니다.m inside "s"inside "s - 공간은 분리되지 않습니다.의 안쪽내부 ''s''s「」의 안쪽의 y.의 안쪽, 「」의 내부inside "s - 공간은 분리되지 않습니다."가까운 2인조 그룹인용문은 바로 그 뒤에 붙습니다.따뜻한 언랩 텍스트로 동작합니다.외부 "s" - 이전 인접 그룹에 가입합니다.i는 "s-..." 밖에 있습니다.
! outside "s - ..."
개방 이중 계층 그룹"가까운 2인조 그룹인용문은 바로 그 뒤에 붙습니다.따뜻한 언랩 텍스트로 동작합니다.

따라서 텍스트는 실질적으로 4개의 문자 그룹(단, 아무것도 없는 그룹)에 결합됩니다.
Tim says, 첫 입니다.
"Hi! 않음(), 두 번째(스페이스 없음)
않는 입니다.
"네번,, 마되지지지지않 다다다다다다

보시는 바와 같이 이중 따옴표가 없는 경우 다음 이중 따옴표는 일반 텍스트가 아닌 이중 따옴표로 묶인 그룹을 열 수 있으므로 이중 따옴표는 여전히 필요하지 않습니다.

이를 통해 내부와 외부 따옴표에서 3개의 이중 따옴표가 이스케이프되지 않은 평문의 이중 따옴표 역할을 한다는 것을 알 수 있습니다.

팀은 그에게 "요즘 무슨 일이 있었어요?"라고 말했다.

합니다.를 인쇄합니다.Tim said to him, "What's been happening lately?"의 따옴표를하게 이스케이프로 할 수 .따라서 항상 3개의 따옴표를 이스케이프로 확실하게 사용할 수 있습니다.
다만, 이것을 이해하면, 기술적으로는 불필요한 빈 이중 따옴표 그룹을 추가하고 있기 때문에, 마지막에 있는 4개의 따옴표는 2개로 축소할 수 있습니다.

종료하는 예를 몇 가지 나타냅니다.

B REM이 (a)와 (b)를 송신하는 프로그램프로그램 'a'가 REM이 송신한다("a")프로그램 "a b"가 REM이 ("a")와 (b)를 전송합니다.「안녕하세요」라고 마이크가 말했다.렘은 「안녕하세요」라고 말했다.
프로그램 "a"b"c"d"는 "그룹이 아무것도 랩하지 않기 때문에 REM이 (abcd)를 보냅니다.프로그램 "hello to "quotes" REM이 보내는 ("quotes"에 대한 hello to "quotes")프로그램 "hello world" REM이 보내는 "hello world"프로그램 "hello world" REM이 보내는 ("hello world")프로그램 "hello "world" REM이 보내는 ("hello")및 (world)프로그램 "hello "world" REM이 보내는 (hello "world")프로그램 "hello "world" REM이 보내는 (hello "world")

마지막 메모:나는 어떤 튜토리얼에서도 이것을 읽은 적이 없다.-나는 모든 것을 실험으로 생각해냈다.따라서 내 설명은 내심 사실이 아닐 수 있다.그럼에도 불구하고 위의 모든 예는 주어진 대로 평가하고, 따라서 내 이론을 입증하지는 않는다.

이것을 Windows 7, 64비트로 테스트했습니다.파라미터가 전달된 *.exe 콜만을 사용하여 테스트했습니다(*.bat은 아니지만, 같은 기능을 할 수 있을 것입니다).

할 수 : if을 i i i i i i i i i i i i i i i i i i i i i i i i i i i?myscript '"test"' 파일 " " " 를 myscript.bat 포함하다@echo.%1또는 심지어@echo.%~1 , 모든적견 , , , , , 。'"test"'

캐릭터를 해 .^ 이렇게요.myscript '^"test^"'

이것을 시험해 보세요.

myscript """test"""

파라미터의 "scape to single" 입니다.

Peter Mortensen이 Codesmith의 답변에 대한 그의 코멘트에서 인용한 두 번째 문서는 나에게 훨씬 더 명확해졌다.이 문서는 windowsinspired.com에 의해 작성되었습니다.링크가 반복되었습니다. Windows 명령줄 인수의 인용과 이스케이프를 이해하는 더 좋은 방법

시행착오를 더하면 다음 가이드라인이 생성됩니다.

"^ 다른 를 들면, Windows 커맨드 셸<,>,|,&대신 일반 문자로 해석된 다음 캐럿으로 이스케이프합니다.

프로그램 foo가 명령줄 텍스트를 수신하도록 하려면"a\"b c" > d출력을 파일 아웃으로 리다이렉트 합니다.txt를 실행한 후 Windows 명령 셸에서 다음과 같이 프로그램을 시작합니다.

foo ^"a\^"b c^" ^> d > out.txt

foo가 해석하는 경우\"리터럴 이중 따옴표로 지정되며 이스케이프되지 않은 이중 따옴표로 공백이 포함된 인수를 구분하고 foo는 명령어를 하나의 인수를 지정하는 것으로 해석합니다.a"b c, 인수 1개>및의 인수, 「」를 지정합니다.d.

대신 foo가 이중 따옴표를 해석하는 경우""합니다.

foo ^"a^"^"b c^" ^> d > out.txt

인용된 문서의 주요 내용은 Windows 명령 셸에 대해 이스케이프되지 않은 이중 따옴표가 두 가지 가능한 상태 간 전환을 트리거한다는 것입니다.

는, 파일 또는 에의 리다이렉트)가이 인식되고 것을 합니다.^는 큰따옴표를 이스케이프하고 캐럿이 입력에서 삭제됩니다.다른 상태에서는 리다이렉션이 인식되지 않고 캐럿은 큰따옴표를 피해 제거되지 않습니다.이러한 상태를 각각 '외부'와 '내부'라고 합니다.

명령어 출력을 리다이렉트하려면 리다이렉션에 도달했을 때 명령어셸이 outside 스테이트여야 합니다.따라서 리다이렉션 앞에는 짝수의 이스케이프되지 않은(캐럿 단위) 이중 따옴표가 있어야 합니다. foo "a\"b " > out.txt않습니다이 전체 시킵니다.이치"a\"b " > out.txt전달만 하는 것이 아니라 결합된 명령줄 인수로 foo를 사용합니다."a\"b "출력을 출력으로 리다이렉트 합니다.txt를 클릭합니다.

foo "a\^"b " > out.txt안 이 안 요.^는, 문자가, 에, 합니다."a\^"b " > out.txtfoo에게 전달됩니다.

(바람직하게) 항상 기능하는 유일한 방법은 명령어셸을 항상 Outside 상태로 유지하는 것입니다.이렇게 하면 리다이렉션이 동작하기 때문입니다.

리다이렉트(또는 명령 셸에 특별한 의미가 있는 다른 문자)가 필요하지 않은 경우 주의사항 없이 수행할 수 있습니다.foo가 해석하는 경우\"로서 「」라고 수 .

foo "a\"b c"

그러면 foo는 받습니다."a\"b c"된 인수가 되며, 이 인수로 해석할 수 .a"b c.

입니다. myscript '"test"'된 경우 Windows를 통과합니다.'"test"'myscript까지.myscript는 단일 따옴표와 이중 따옴표를 인수 구분자로 해석하여 삭제합니다.myscript가 문자 그대로의 큰따옴표로 받아들여지는 것을 파악하여 명령어로 지정해야 합니다.^Windows 명령 셸에 특별한 의미가 있는 문자를 이스케이프합니다.myscriptUnix에서도 할 수 있습니다. Unix에서도 사용할 수 있습니다.\"과가있있 있있있다다해 보다

myscript \^"test\^"

리다이렉션이 필요 없는 경우

myscript \"test\"

cmd에서 powershell에 전화했는데 인용문을 주고받았더니 둘 다 안 먹혔어이 Win 10 서피스 프로에서는 무거운 액센트가 이중 따옴표를 피하기 위해 작용했다.

>powershell.exe "echo la`"" >> test
>type test
la"

다음은 큰따옴표를 피하기 위해 얻은 다른 문자 출력입니다.

la\
la^
la
la~

다른 견적을 사용하여 견적을 회피해도 견적은 나오지 않았습니다.보시는 것처럼 글자 자체는 타이핑이 되어있지만 큰따옴표는 피해가지 않았습니다.

온 은, 「이러다」에 로, 회피할 수 입니다./ccmd.exe

CMD /c "MKDIR "foo bar""

실행하다

MKDIR "foo bar"

일견 생각지도 못했던 행동입니다.

언급URL : https://stackoverflow.com/questions/7760545/escape-double-quotes-in-parameter

반응형