$@ 문자 그대로 printf하는 방법이 있나요?

$@ 문자 그대로 printf하는 방법이 있나요?

줄 바꿈 없이 잠재적인 큰따옴표를 포함하여 그대로 에코 stdout하는 스크립트를 작성하고 싶습니다 .$@

내가 시도한 것:

> cat ./script1    
#! /usr/bin/bash
printf "%s %s" $0 $@
echo -n $0 $@
echo -n "$0 $@"
> 
> ./script1 a "bc d"
./script1 abc d./script1 a bc d./script1 a bc d>

내 스크립트를 다음과 같이 실행하고 싶습니다.

> ./script1 a "bc d"
./script1 a "bc d">

이를 수행할 수 있는 방법이 있습니까?

답변1

예제에서는 위치 매개변수에 큰따옴표가 포함되어 있지 않습니다.

./script1 a "bc d"

큰따옴표는 단순히 bc와 사이의 공백에서 단어 분리를 수행해서는 안 된다는 것을 쉘에 알려줍니다 d.

두 번째 인수에 리터럴 따옴표를 포함하려면 이를 이스케이프 처리하여 쉘에 리터럴임을 알려야 합니다.

./script1 a '"bc d"'

또는

./script1 a \"bc\ d\"

printf셸 입력(이스케이프)으로 재사용할 수 있는 형식으로 인쇄 할 수 있습니다 .

$ set -- a "bc d"
$ printf '%q\n' "$@"
a
bc\ d

보시다시피 이것은 단지 공간을 벗어나는 것입니다.

답변2

다른 곳에서 설명했듯이, 입력한 큰따옴표는 포함된 텍스트가 단일 단어로 처리된다는 것을 쉘에 나타냅니다. 인용된 단어를 인쇄하려면 출력 텍스트에 해당 단어를 포함시키기만 하면 됩니다.

#!/bin/bash
printf '"%s" ' "$@"
printf "\n"

이는 명령을 실행할 때 큰따옴표를 포함할 수 있는 매개변수뿐만 아니라 모든 매개변수에 큰따옴표를 추가한다는 점에 유의하십시오.

관련 정보