2012-01-28 9 views
11

printf% q powinien zacytować ciąg. Jednak po wykonaniu w skrypcie, usuwa spacje.

Polecenie:

printf %q "hello world" 

Wyjścia:

hello\ world 

która jest poprawna.

Ten skrypt:

#!/bin/bash 

str="hello world" 
printf %q $str 

wyjścia:

helloworld 

co jest źle.

Jeśli takie zachowanie jest rzeczywiście oczekiwane, jaka alternatywa istnieje w skrypcie do cytowania łańcucha zawierającego dowolną postać w taki sposób, że można go przetłumaczyć z powrotem na oryginał za pomocą wywoływanego programu?

Dzięki.

oprogramowania GNU bash, wersja 4.1.5 (1) -release (i486-pc-linux-gnu)

edycja: rozwiązany, dzięki.

+3

usunął 'SOLVED' prefiksu w tytule stanowisko. W StackOverflow.com, nie oznaczaj problemu jako rozwiązanego przez prefiksowanie nagłówka "ROZWIĄZYWANIE" Możesz zaakceptować odpowiedź lub zamieścić własną odpowiedź i zaakceptować ją, klikając znak zaznaczenia pod przyciskami do głosowania w pobliżu odpowiedzi, która działała dla Ciebie. –

Odpowiedz

34

Należy użyć:

printf %q "$str" 

Przykład:

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

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

Po uruchomieniu printf %q $str, powłoka rozszerza go na adres:

printf %q hello world 

Więc struny hello i world są dostarczone jako dwa osobne argumenty do printf polecenie i wypisuje dwa argumenty obok siebie.

Ale po uruchomieniu printf %q "$str", powłoka rozszerza go na adres:

printf %q "hello world" 

W tym przypadku, łańcuch hello world jest dostarczany jako pojedynczy argument do komendy printf. To jest to, czego chcesz.

Oto coś można eksperymentować z bawić się z tymi pojęciami:

[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

Nie widzę żadnego odniesienia do q będącego prawidłowym parametrem formatu na stronie podręcznika. Czy ktoś mógłby wyjaśnić, dlaczego% q działa? Czy jest przestarzałe i czy istnieje nowy preferowany parametr formatu? Nie widzę niczego na stronie podręcznika opisującego tę funkcję. –

+0

Z wyjścia 'help printf' -'% q \t zacytuj argument w sposób, który może być ponownie użyty jako wejście powłoki '. –

+1

@AnthonyDiSanti, to jest z Basha, więc możesz go znaleźć w 'man bash' lub' help printf' w powłoce Basha. Może patrzyłeś na 'man 1 printf' lub' man 3 printf'? '% q' nie ma do nich zastosowania. –

1

Spróbuj

printf %q "${str}" 

w skrypcie.

0

To zadziałało dla mnie.Spełnia te wymagania

  1. Zebrane arbitralną wejście, które może obejmować powłoki znaków specjalnych
  2. nie wyjściowy charakter Escape, The "\"
#! /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

Tak więc, jeśli wykonuję echo $ FOO przed poleceniem escape, wynik jest dokładnie taki sam jak końcowe echo. Wygląda więc na to, że odsłaniasz swój łańcuch znaków ucieczki, w takim razie jaki jest sens ucieczki? (przynajmniej w kontekście pokazanym tutaj) –

Powiązane problemy