2012-01-28 2 views
11

printf % q 문자열을 인용해야합니다. 그러나 스크립트로 실행되면 공간을 삭제합니다.

이 명령

printf %q "hello world" 

출력 : 올바른

hello\ world 

.

이 스크립트 :

#!/bin/bash 

str="hello world" 
printf %q $str 

출력 : 잘못

helloworld 

.

실제로 이러한 동작이 예상되는 경우 호출 된 프로그램에서 원본으로 다시 변환 할 수있는 방식으로 문자가 포함 된 문자열을 인용 할 수있는 대체 스크립트가 있습니까?

감사합니다.

소프트웨어 : GNU bash는 버전 4.1.5 (1) -release (을 i486-PC-리눅스 GNU)

편집 : 해결, 감사합니다.

+3

합니까 쉘 특수 문자를 포함 할 수있다 임의의 입력을 수락 만족하여 게시하다. StackOverflow.com에서는 제목에 'SOLVED'라는 접두어를 붙여서 문제를 표시하지 않습니다. 답변을 수락하거나 자신의 답변을 게시하고 작동 한 답변 근처의 투표 버튼 아래에있는 체크 표시를 클릭하여 동의하십시오 너를 위해서. –

답변

34

당신은 사용해야

printf %q "$str" 

예 :

printf %q hello world 

그래서, 문자열 helloworld은 다음과 같습니다

[email protected]:~$ cat a.sh 
#!/bin/bash 

str="hello world" 
printf %q "$str" 
[email protected]:~$ ./a.sh 
hello\ world 

당신이 printf %q $str 실행, 쉘은 그것을 확장에 대한 두 개의 별도 인수로 제공됩니다.210 명령을 사용하고 두 개의 인수를 나란히 인쇄합니다.

하지만 printf %q "$str"을 실행할 때, 쉘이 그것을 확장이 경우

printf %q "hello world" 

는 문자열 hello worldprintf 명령에 단일 인수로 제공됩니다. 이것이 당신이 원하는 것입니다.

[email protected]:~$ showargs() { echo "COUNT: $#"; printf "ARG: %s\n" "[email protected]"; } 
[email protected]:~$ showargs hello world 
COUNT: 2 
ARG: hello 
ARG: world 
[email protected]:~$ showargs "hello world" 
COUNT: 1 
ARG: hello world 
[email protected]:~$ showargs "hello world" "bye world" 
COUNT: 2 
ARG: hello world 
ARG: bye world 
[email protected]:~$ str="hello world" 
[email protected]:~$ showargs $str 
COUNT: 2 
ARG: hello 
ARG: world 
[email protected]:~$ showargs "$str" 
COUNT: 1 
ARG: hello world 
+0

설명서 페이지에 q가 유효한 형식 매개 변수라는 것에 대한 참조가 없습니다. 누군가가 왜 % q 작동하는지 설명 할 수 있습니까? 더 이상 사용되지 않는 형식 매개 변수가 사용됩니까? 이 기능을 설명하는 맨 페이지에는 아무것도 표시되지 않습니다. –

+0

'help printf'의 출력에서'% q \t은 쉘 입력으로 재사용 될 수있는 방식으로 인수를 인용합니다. ' –

+1

@AnthonyDiSanti, 이것은 Bash에서 왔기 때문에 Bash 쉘의'man bash' 또는'help printf'에서 찾을 수 있습니다. 아마도'man 1 printf' 또는'man 3 printf'를보고 계셨습니까? '% q'은 그것들에 적용되지 않습니다. –

1

스크립트에서

printf %q "${str}" 

을 시도해보십시오 여기

는 이러한 개념을 재생하는 실험을 수있는 일이다.

0

이것은 나를 위해 일했습니다.이러한 요구 사항이

  1. 가 출력되지 이스케이프 문자의 제목에 '해결하고자'접두사를 제거은 "\"
#! /bin/bash 

FOO='myTest3$; t%^&;frog now! and *()"' 

FOO=`printf "%q" "$FOO"`      # Has \ chars 
echo $FOO 

# Eat all the \ chars 
FOO=$(printf "%q" "$FOO" | sed "s/\\\\//g")  # Strip \ chars 

echo $FOO 
+0

그래서 escape 명령 이전에 $ FOO를 echo하면 출력은 최종 echo와 정확히 동일합니다. 따라서 이스케이프 처리 된 문자열을 이스케이프 처리하지 않는 것으로 보입니다. 이스케이프 처리 된 문자열이 이스케이프 처리 된 이유는 무엇입니까? (최소한 여기에 표시된 맥락에서) –

관련 문제