2012-01-28 9 views
11

printf% q एक स्ट्रिंग उद्धृत करना चाहिए। हालांकि, जब एक स्क्रिप्ट में निष्पादित किया जाता है, तो यह रिक्त स्थान हटा देता है।

यह आदेश:

printf %q "hello world" 

आउटपुट:

hello\ world 

जो सही है।

यह स्क्रिप्ट:

#!/bin/bash 

str="hello world" 
printf %q $str 

आउटपुट:

helloworld 

जो गलत है।

यदि ऐसा व्यवहार वास्तव में अपेक्षित है, तो किसी भी चरित्र वाले किसी स्ट्रिंग को उद्धृत करने के लिए स्क्रिप्ट में कौन सा विकल्प मौजूद है, जिसे इसे किसी प्रोग्राम द्वारा मूल में वापस अनुवादित किया जा सकता है?

धन्यवाद।

सॉफ्टवेयर: जीएनयू बैश, संस्करण 4.1.5 (1) -release (i486-पीसी-linux-gnu)

संपादित: हल, धन्यवाद।

+3

के शीर्षक में 'हल' उपसर्ग निकाला गया है शामिल हो सकते हैं स्वीकार करें अपने पद। StackOverflow.com में, आप 'सॉल्वड' के साथ शीर्षक को उपसर्ग करके हल की गई समस्या को चिह्नित नहीं करते हैं, आप एक उत्तर स्वीकार करते हैं या आप अपना उत्तर पोस्ट करते हैं और काम के उत्तर के पास मतदान बटन के नीचे टिक-चिह्न पर क्लिक करके इसे स्वीकार करते हैं तुम्हारे लिए। –

उत्तर

34

आप उपयोग करना चाहिए:

printf %q "$str" 

उदाहरण:

printf %q hello world 

तो, तार hello और world हैं:

[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 क्यों काम करता है? क्या यह बहिष्कृत है और अब एक नया पसंदीदा प्रारूप पैरामीटर है? मुझे उस पृष्ठ पृष्ठ में कुछ भी दिखाई नहीं देता है जो इस कार्यक्षमता का वर्णन करता है। –

+0

'सहायता printf' के आउटपुट से - '% q \t तर्क को इस तरह से उद्धृत करें जिसे खोल इनपुट के रूप में पुन: उपयोग किया जा सकता है। –

+1

@ एंथनी दीसांति, यह बैश से है, इसलिए आप इसे 'बैश खोल' में 'मैन बाश' या 'हेल्प प्रिंटफ'' में पा सकते हैं। शायद आप 'मैन 1 printf' या' मैन 3 printf' 'देख रहे थे? '% q' उन पर लागू नहीं होता है। –

1

अपनी स्क्रिप्ट में प्रयास करें

printf %q "${str}" 

:

यहाँ कुछ आप इन अवधारणाओं के साथ खेलने के साथ प्रयोग कर सकते है।

0

यह मेरे लिए काम किया।संतुष्ट इन आवश्यकताओं

  1. मनमाने ढंग से इनपुट कि खोल विशेष वर्ण
  2. नहीं उत्पादन एस्केप वर्ण, "\"
#! /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

तो, अगर मैं एस्केप कमांड से पहले $ FOO को प्रतिबिंबित करता हूं, तो आउटपुट आपकी अंतिम प्रतिध्वनि के समान ही है। तो ऐसा प्रतीत होता है कि आप अपनी बच निकलने वाली स्ट्रिंग से बच रहे हैं, इस मामले में इससे बचने का क्या मतलब है? (कम से कम यहां दिखाए गए संदर्भ में) –

संबंधित मुद्दे