Bash 기능에서 올바른 견적 이스케이프/보존

Bash 기능에서 올바른 견적 이스케이프/보존

터미널에 2개의 매개변수와 함께 다음 명령을 입력하면 필요한 작업이 수행됩니다.

mycommand 'string that includes many spaces and double quotes' 'another string that includes many spaces and double quotes'

이제 위의 내용을 bash 스크립트로 옮겼습니다.

C=mycommand 'string that includes many spaces and double quotes'
function f {
 $C $1
}
# let's call it
f 'another string that includes many spaces and double quotes'

분명히 이것은 동일한 결과나 유용한 결과를 생성하지 않습니다. 하지만 따옴표, 공백을 유지 및/또는 적절하게 이스케이프 처리하고 실제 인수 수를 유지하는 올바른 방법을 찾을 수 없습니다.내 주문2로 취급됩니다.

저는 Mac에서 GNU bash 버전 3.2.57을 사용하고 있습니다.

답변1

각 인수를 인용하면 위치 인수로 올바르게 처리됩니다.

#!/usr/local/bin/bash
f() {
  echo "function was called with $# parameters:"
  while ! [[ -z $1 ]]; do
    echo "  '$1'"
    shift
  done
}
f "param 1" "param 2" "a third parameter"
$ ./459461.sh
function was called with 3 parameters:
  'param 1'
  'param 2'
  'a third parameter'

그러나 포함하는(즉, 가장 바깥쪽) 따옴표는 다음과 같습니다.아니요매개변수 자체의 일부입니다. 약간 다른 함수 호출을 시도해 보겠습니다.

$ tail -n1 459461.sh
f "them's fightin' words" '"Holy moly," I shouted.'
$ ./459461.sh
function was called with 2 parameters:
  'them's fightin' words'
  '"Holy moly," I shouted.'

'출력에 복사된 매개변수 주변의 s는 매개 echo변수 자체가 아니라 함수의 명령문에서 나온 것입니다.

예제 코드를 인용문에 더욱 잘 인식하도록 하려면 다음을 수행할 수 있습니다.

C=mycommand
f() {
  $C "unchanging first parameter" "$1"
}
# let's call it
f 'another string that includes many spaces and double quotes'

아니면 이거:

C=mycommand
f() {
  $C "$1" "$2"
}
# let's call it
f 'Some string with "quotes" that are scary' 'some other "long" string'

관련 정보