2011-08-08 14 views
5

आदेश के बादलिनक्स/बैश: अनकोट कैसे करें?

echo 'a b' 'c' 

आउटपुट

a b c 

लेकिन निम्नलिखित

X="'a b' 'c'" 
echo $X; 

'a b' 'c' 

outout होगा मैं के लिए एक रास्ता तलाश कर रहा हूँ $ X को छोड़ दें, ताकि यह "ए बी सी" आउटपुट कर सके, लेकिन मर्ज किए गए 'ए बी' तर्क को खोए बिना। (= 2 के बजाय तर्क 3, आदेश 'गूंज' के लिए कोई फर्क नहीं पड़ता है, लेकिन 'सीपी' जैसे अन्य आदेश के लिए)

+2

$ {X // \ '/} गूंजें; // ए बी सी –

उत्तर

7

कोशिश xargs:

$ echo $x 
'a b' 'c' 

$ echo $x | xargs ./echo 
argc = 3 
argv[0] = ./echo 
argv[1] = a b 
argv[2] = c 
+0

नोट: xargs प्रक्रिया की निकास स्थिति वापस नहीं कर सकता है। किसी भी त्रुटि 1-125 को 123 के रूप में दिखाया जाएगा। (शायद कोई वर्कअराउंड उपलब्ध नहीं है) मैं संभवतः बाहर निकलने का उपयोग करूंगा, ताकि बाहर निकलने वाले –

0

यह बालों है, मैं चारों ओर कार्य करने की सिफारिश करता हूँ मुद्दा और पहली जगह "ab" और "c" को संयोजित नहीं करते हैं। अगर ऐसा नहीं है

$ x='$((3+5))' 
$ eval echo $x 
8 

क्या आप का उपयोग @ vanza के हैं:

7
eval echo $x 

इस पहले तर्क और c के रूप में एक दूसरे के

नोट के रूप में a b पारित करेंगे: यह वास्तव में तर्क का मूल्यांकन करेंगे, जैसे xargs

+0

धन्यवाद का उपयोग करने में सक्षम हो सकें। मैंने अभी तक "eval" का उपयोग नहीं किया है, लेकिन ऐसा लगता है कि स्क्रिप्ट-इंजेक्शन के अनुसार xargs सुरक्षित है। –

0
X="'a b' 'c'" 
echo $X 
eval "echo $X" 

जब आप इस कोड को आप अगर X संभवतः \"$ या बैकटिक जैसे विशेष वर्ण हो सकते हैं सावधान रहना होगा का उपयोग करें।

0

क्या आप वाकई echoecho $X में 2 पैरामीटर प्राप्त करते हैं?

X="'a b' 'c'" 
function f(){ echo $#; echo $1; echo $2; echo $3; } 
f $X 

प्रदर्शित करता है:

3 
'a 
b' 
'c' 

3 मानकों 'a, b' और 'c' हैं मेरे लिए, यह 3. प्राप्त करता है की कोशिश की सुविधा देता है। मुझे नहीं लगता कि यह वही है जो आप उम्मीद करते हैं।

X="a b|c" 
IFS="|" 
function f(){ echo $#; echo $1; echo $2; } 
f $X 
1

आमतौर पर, यदि आप:

आप एक बहु पैरामीटर चर का निर्माण करना चाहते हैं, तो एक चार आप का उपयोग करेगा नहीं (शायद |), और अपने चर में एक पैरामीटर सीमांकक के रूप में उपयोग करने के लिए भारतीय विदेश सेवा के लिए सेट

X=('a b' 'c') 
printf "%s\n" "${X[@]}" 

प्रिंट:

एकल वैरिएबल में एक से अधिक "शब्दों" संगृहीत करने का प्रयास कर रहे ', की सिफारिश की विधि एम्बेडेड उद्धरण चिह्नों का उपयोग करने के लिए नहीं है, लेकिन एक सरणी का उपयोग करने के लिए है
0

स्थितित्मक पैरामीटर सरणी [email protected] में तर्कों का पुन: विश्लेषण करने के लिए xargs और sh -c 'cmd' _ arg1 arg2 ... को गठबंधन करना भी संभव है।

एक चर करने के लिए उत्पादन नियत और stderr के लिए कुछ भी लेकिन पिछले प्रक्रिया के निकास स्थिति $? पुनः निर्देशित, उदाहरण के लिए, एक चर में पिछले प्रक्रिया के निकास कोड की दुकान और इसका इस्तेमाल करने के लिए यह संभव बनाता है के बाद समाप्त हो गया है xargs निष्पादन।

X="'a b' 'c'" 

ret="$(
export IFS='' 
set -o pipefail 
echo $X | xargs sh -c ' 
    for file in "[email protected]"; do 
     echo cp "$file" destdir 1>&2 || { echo $?; kill -HUP $PPID; exit $?; } 
     #(exit 3) || { echo $?; kill -HUP $PPID; exit $?; } 
     #(exit 3) || { echo $?; kill -HUP $PPID; kill -HUP -- -$$; } 
    done 
    echo $? 
' _ 
echo $? '|' ${PIPESTATUS[@]} 1>&2 
)" 
echo "$ret" | tail -1 
0

कृपया इस तरह के कुछ के लिए eval का उपयोग न करें। setecho के अलावा पैरामीटर और कमांड की अखंडता बनाए रखेगा उनके साथ अच्छी तरह से खेलेंगे। बस ध्यान रखें कि आप संदर्भ (ओं) को किसी मौजूदा स्थितित्मक पैरामीटर में खो देंगे।

set -- "a b" "c" 
echo "[email protected]" 
#a b c 
echo $1 
#a b 
echo $2 
#c 
संबंधित मुद्दे