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