2012-01-28 9 views
11

printf% q dovrebbe citare una stringa. Tuttavia, quando viene eseguito in uno script, cancella gli spazi.

Questo comando:

printf %q "hello world" 

uscite:

hello\ world 

che è corretto.

Questo script:

#!/bin/bash 

str="hello world" 
printf %q $str 

uscite:

helloworld 

che è sbagliato.

Se tale comportamento è effettivamente previsto, quale alternativa esiste in uno script per la citazione di una stringa contenente un carattere in modo che possa essere tradotta nell'originale da un programma chiamato?

Grazie.

Software: GNU bash, la versione 4.1.5 (1) -release (i486-pc-linux-gnu)

Modificato: risolto, grazie.

+3

Rimosso il prefisso 'RISOLTO' nel titolo del tuo inviare. In StackOverflow.com, non contrassegni un problema come risolto anteponendo l'intestazione con "SOLVED". Accetta una risposta o pubblichi la tua risposta e la accetti facendo clic sul segno di spunta sotto i pulsanti di votazione accanto alla risposta che ha funzionato per te. –

risposta

34

Si dovrebbe usare:

printf %q "$str" 

Esempio:

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

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

Quando si esegue printf %q $str, la shell espande a:

printf %q hello world 

Così, le corde hello e world sono fornito come due argomenti separati allo printf comando e stampa i due argomenti fianco a fianco.

Ma quando si esegue printf %q "$str", la shell espande a:

printf %q "hello world" 

In questo caso, la stringa hello world è fornito come un unico argomento al comando printf. Questo è quello che vuoi.

Qui è qualcosa che si può sperimentare di giocare con questi concetti:

[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

Non vedo alcun riferimento al fatto che q sia un parametro di formato valido nella pagina man. Qualcuno potrebbe spiegare perché% q funziona? È deprecato e ora c'è un nuovo parametro di formato preferito? Non vedo nulla nella pagina man che descrive questa funzionalità. –

+0

Dall'output di 'help printf' -'% q \t cita l'argomento in un modo che può essere riutilizzato come input della shell '. –

+1

@AnthonyDiSanti, questo è da Bash, quindi puoi trovarlo in 'man bash' o' help printf' in una shell Bash. Forse stavi guardando 'man 1 printf' o' man 3 printf'? '% q' non si applica a quelli. –

1

Prova

printf %q "${str}" 

nello script.

0

Questo ha funzionato per me.Soddisfa queste esigenze

  1. di accettare input arbitrario che può includere shell caratteri speciali
  2. non emette carattere di escape, la "\"
#! /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

Quindi, se echo $ FOO prima del comando escape, l'output è esattamente lo stesso dell'eco finale. Quindi sembra che tu non stia sfuggendo alla tua stringa di escape, nel qual caso qual è il punto di sfuggirlo? (almeno nel contesto mostrato qui) –