bash - 문자를 이스케이프하는 기능?

bash - 문자를 이스케이프하는 기능?

일부 작업을 자동화하려고 하는데 스크립트에 인수로 전달된 값을 이스케이프 처리하는 문제에 직면하고 있습니다.

myScript.sh

#!/bin/bash

loadPatch -name $1

$1첫 번째 매개변수는 "p12.9.5-bug34"와 같은 값을 가질 수 있습니다.

다음과 같이 실행

myScript p12.9.5-bug34

결과가 없다. 성공 여부에 대한 출력을 확인했지만 echo $?필요한 조치가 발생하지 않았습니다.

$1스크립트의 테스트를 이 실제 값으로 바꾸었고 예상대로 작동합니다 . loadPatch수신된 매개변수를 확인하기 위해 인쇄 문을 넣을 수 없습니다 .

따라서 여기에 몇 가지 이스케이프 문제가 있다고 가정하고 매개 변수를 사용하기 전에 매개 변수를 이스케이프하는 데 사용할 수 있는 함수/유틸리티가 있는지 알아야 합니다.

다른 오류를 발견하면 알려주세요.

답변1

다른 사람들이 이 제목을 검색할 수 있으므로 이 질문에 답하세요.

  • zsh 전용: print -r -- ${(q)var} ${(qq)var} ${(qqq)var} ${(qqqq)var} 다양한 유형의 참조에 사용됩니다.
  • ksh93, zsh 또는 bash:printf %q "$var"
  • BusyBox(및 위의 모든 항목)

    vars를 사용하면 ash, bash 및 ksh 간의 차이점이 제거됩니다.

    q1="'"
    q2="'\''"
    printf '%s\n' "'${var//$q1/$q2}'"
    

    대시 및 이전 쉘(${var//pat/str}이 누락된 쉘)에는 없습니다.

  • 가장 휴대하기 좋나요?

    printf "'%s'\n" "$(printf '%s' "$var" | sed "s/'/'\\\\''/g")"
    
    Or
    
    printf '%s\n' "$var" | sed "s/'/'\\\\''/g; 1s/^/'/; \$s/$/'/"
    

개선을 환영합니다!

답변2

파일 이름의 특수 문자가 문제가 되지 않는다는 점에 동의합니다.

때때로 스크립트가 내가 예상한 폴더에서 실행되지 않는 것을 발견했습니다. "loadPatch -name"을 "echo"로 바꾸면 $1이 예상한 값인지 확인할 수 있습니다. 이것이 예상한 것이라면 다음 행을 추가하여 현재 디렉토리가 예상한 것과 같은지 확인하십시오.

ls -l $1
pwd

관련 정보