이론

이론
#!/bin/bash
wineuser=tom
su $wineuser -c "sed -i '$ialias ptgui "wine ~/.wine/drive_c/Program\ Files/PTGui/PTGui.exe\"' /usr/people/$wineuser/config/cshrc.csh"

Tom의 cshrc.csh에 삽입된 실제 행은 다음과 같아야 합니다.

alias ptgui 'wine ~/.wine/drive_c/Program\ Files/PTGui/PTGui.exe'

sed 명령 '$ialias...' $i는 파일의 마지막 줄 앞에 삽입되며 정의된 변수가 아닙니다.

다단계 탈출을 설명하는 팁이나 매뉴얼도 환영합니다.

답변1

이론

규칙은 다음과 같습니다:

  • '구분된 문자열 내에서는 아무것도 해석되지 않으며 a 이외의 다른 내용은 '특별한 의미가 없습니다. 이는 이스케이프만 필요하다는 의미 '이지만, 이스케이프하려면 '\''. (첫 번째 문자열은 '문자열을 끝내고 \'리터럴 '(새 문자열의 시작을 방지하기 위해 이스케이프 처리)이 뒤따르고, 마지막 문자열은 '새 문자열을 시작합니다. 이 세 문자열은 구분 기호(일반적으로 공백)로 구분되지 않으므로 하나의 연속된 문자열로 처리됩니다.

  • string 내부에서 "변수 확장이 발생하고 이스케이프가 해석됩니다. 따라서 리터럴을 원하면 \이스케이프해야 합니다. 또한 리터럴을 원한다면 $이를 이스케이프해야 합니다(그렇지 않으면 변수 확장으로 해석됩니다).

필요에 따라 이 두 가지 인용 스타일을 결합하여 다양한 방법으로 명령을 이스케이프할 수 있습니다. 아래 목록은 특정 문제에 대한 가능한 해결책 중 하나입니다.

sed또한 이스케이프 문자로 도 해석된다는 점을 명심하세요 \. 즉, 스크립트에서 문자 그대로 사용할 때 해당 문자를 이스케이프해야 한다는 뜻이기도 합니다 sed.

개인적으로 나는 가장 안쪽의 코드 단위부터 시작하여 바깥쪽으로 작업하는 것이 더 쉽다고 생각합니다. 매번 내부 코드 단위의 외부 참조 메서드에서 사용되는 특수 문자를 참조합니다.

예를 들어, 파일의 문자열을 바꾸고 It's a test그 결과를 파일에 저장하려는 경우 다음과 같이 따옴표를 사용하면 더 쉽게 만들 수 있습니다.It's my test/home/user/I have spaces in my name.txt/home/user/NoSpaces.txt"

sed "s/It's a test/It's my test/" "/home/user/I have spaces in my name.txt" >/home/user/NoSpaces.txt

이제 이를 변수에 저장하려면 다른 참조 레벨을 추가해야 합니다.

  • 다음 방법을 사용하여 이 작업을 수행할 수 있습니다 ( 현재 문자열의 다른 문자를 '이스케이프하는 것을 의미함 ).'

    myvar='sed "s/It'\''s a test/It'\''s my test/" "/home/user/I have spaces in my name.txt" >/home/user/NoSpaces.txt'
    
  • "스타일 인용문을 사용하여 이를 수행 할 수도 있습니다 .

    myvar="sed \"s/It's a test/It's my test/\" \"/home/user/I have spaces in my name.txt\" >/home/user/NoSpaces.txt"
    

경험 법칙은 항상 가장 깨끗하다고 ​​생각되는 솔루션을 선택하는 것입니다.

떨어져 있는

특정 문제에 대해서는 다음을 시도해 볼 수 있습니다.

cmd="sed -i '\$ialias ptgui '\\''wine ~/.wine/drive_c/Program\\\\ Files/PTGui/PTGui.exe'\\' /usr/people/$wineuser/config/cshrc.csh"
su "$wineuser" -c "$cmd"

nsert 명령 a대신 pend를 사용하는 것이 좋지만 이는 질문의 범위를 벗어납니다.ised

관련 정보