나는 많은 다른 솔루션을 시도했지만 배경 정보 및 대안을 포함한 좋은 리소스는 Greg (일명 GreyCat 's) Wiki의 BashFAQ / 096입니다 . 나는 다음 두 가지가 가장 잘 읽을 수 있음을 발견했습니다.
Bash 4.4 이후 ( 뉴스 에서 알 수있는 한 ) 다음 과 같이 매개 변수 확장 을 사용할 수 있습니다 @Q.
adb sh -c "other_tool -a -b ${*@Q}"
전달 된 인수 당 하나의 문자열 대신 하나의 단일 문자열 $*이 $@되기 때문에 대신 여기에서 사용 합니다 "other_tool -a -b ${*@Q}".
bash 배열 변수 를 사용하여 동일한 작업을 수행 ${ARRAY[*]@Q}하려면 따옴표 안에 구문이 필요합니다 .
당신이 경우 배쉬 4.4 이상 사용할 수없는 또는 확실하지, 이건 내 선호하는 솔루션입니다 :
function escapeBashArgs() {
local arg separator=""
for arg
do
printf "%s%q" "$separator" "$arg"
separator=" "
done
}
adb sh -c "other_tool -a -b $(escapeBashArgs "$@")"
참고 여기에 당신은 사용할 필요가 "$@"대신 $@하거나 "$*"또는 $*(가) 사용할 수 없습니다 인용없이 변형, 그래서 당신은 인수 내에서 단어 분할을하지 않으며, 그렇게, 인수의 수를 보존하기를 원하기 때문에 "$*"이 결합 할 것입니다으로 사용할 수 없습니다 단일 인수에 대한 모든 인수. 그런 다음이 함수는 모든 인수를 단일 문자열로 반환합니다.
첫 번째 인수 앞에 추가 공간이 필요하지 않으면 printf형식 문자열을 변경 " %q"하고 separator변수를 제거 할 수 있습니다 . 또는 Gordon Davissons 의 one-liner를 사용할 수 있습니다 .
이 솔루션은 내가 생각해 낼 수있는 모든 경우에 적용됩니다.
- 인수 없음 :
escapeBashArgs→ 없음
- 빈 인수 :
escapeBashArgs "" ""→'' ''
- 공백이있는 인수 :
escapeBashArgs " " " "→ ' ' ' '또는 \ \ \ \ \( 마지막 공간은이 사이트 렌더러가 먹습니다 )
- 특별한 간격과 줄 바꿈과 인수 :
escapeBashArgs "a b" c\ d "arg with
newline"→ 'a b' 'c d' $'arg with\nnewline'또는 a\ \ \ \ \ \ b c\ d $'arg with\nnewline'( 줄 바꿈이 사이 with와 newline,이 때문에이 사이트에 줄 바꿈의의 다른 위치에 )
- 특수 문자가 포함 된 인수 :
escapeBashArgs '$"'\''({:})'→ '$"'\''({:})'또는\$\"\'\(\{:\}\)
- jcayzacs 답변의 예 :
escapeBashArgs x/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"→ 'x/ "b"/aaaaa/'\''xxx yyyy'\''/zz"offf"'또는x/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
(GNU bash 5.0.3 (1)-릴리스로 테스트했습니다.)