2012-01-28 21 views
11

printf% q bir dize belirtmelidir. Ancak, bir betiğe uygulandığında boşlukları siler.

Bu komut:

printf %q "hello world" 

çıkışlar: doğru

hello\ world 

.

Bu komut:

#!/bin/bash 

str="hello world" 
printf %q $str 

çıkışları: yanlış

helloworld 

.

Böyle bir davranış gerçekten bekleniyorsa, herhangi bir karakterin, çağrılan bir program tarafından orijinaline dönüştürülebileceği şekilde bir karakter içeren bir diziyi alıntılamak için bir komut dosyasında hangi alternatif var?

Teşekkürler.

Yazılım: GNU bash, versiyon 4.1.5 (1) -salınımı (i486-pc-linux-gnu)

düzenlendi: çözüldü, teşekkürler.

+3

mu kabuk özel karakterler içerebilir keyfi girdi Kabul tatmin senin sonrası. StackOverflow.com'da, 'SOLVED' ile başlığın ön eklenmesiyle çözülen bir sorunu işaretlemezsiniz. Bir cevabı kabul edersiniz veya kendi cevabınızı gönderirsiniz ve yanıtın yanındaki oylama düğmelerinin altındaki onay işaretini tıklayarak kabul edersiniz. senin için. –

cevap

34

Sen kullanmalıdır:

printf %q "$str" 

Örnek:

printf %q hello world 

Yani, dizeleri hello ve world şunlardır:

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

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

Eğer printf %q $str çalıştırmak, kabuk onu genişletir'e iki ayrı argüman olarak verilir 210 komutu ve iki argümanı yan yana yazdırır.

Ama printf %q "$str" çalıştırdığınızda, kabuk bunu genişletir: Bu durumda

printf %q "hello world" 

, dize hello worldprintf komuta tek argüman olarak verilir. Senin istediğin bu.

[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

Man sayfasında geçerli bir format parametresi olmak için q referans göremiyorum. Birisi% q'un neden çalıştığını açıklayabilir mi? Kullanımdan kaldırıldı mı ve artık yeni bir tercih edilen biçim parametresi var mı? Bu sayfada işlevselliği açıklayan bir şey göremiyorum. –

+0

'printf' -'% q \t çıktısının çıktısından, argümanı kabuk girdisi olarak yeniden kullanılabilecek şekilde alıntılayın. –

+1

@AnthonyDiSanti, bu Bash’ten, yani Bash kabuğunda 'bash' veya' printf' yardımında bulabilirsiniz. Belki de "adam 1 printf" ya da "adam 3 printf" a bakıyordun? '% q', bunlara uygulanmaz. –

1

Betiğinizde

printf %q "${str}" 

deneyin: İşte

bu kavramlarla oynamayı deneyebilirsiniz şeydir.

0

Bu benim için çalıştı.Bu gereksinimler

  1. değil çıkış kaçış karakteri, başlığında 'ÇÖZÜLDÜ' öneki Kaldırılan "\"
#! /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

Öyleyse, kaçış komutundan önce FOO $ eklediğimde, çıktı son eko ile aynıdır. Öyleyse kaçan dizgeni kaçırıyorsunuz, bu durumda kaçma noktası nedir? (en azından burada gösterilen bağlamda) –