줄 바꿈 없이 잠재적인 큰따옴표를 포함하여 그대로 에코 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"
이는 명령을 실행할 때 큰따옴표를 포함할 수 있는 매개변수뿐만 아니라 모든 매개변수에 큰따옴표를 추가한다는 점에 유의하십시오.