2010-06-24 8 views
16

मुझे एक बैश स्क्रिप्ट से लाइब्रेरी की साझा लाइब्रेरी निर्भरताओं को संसाधित करने की आवश्यकता है। for आदेश प्रक्रियाओं शब्द-दर-शब्द:आप शेल लाइन-दर-लाइन में कमांड के आउटपुट को कैसे संसाधित करते हैं?

for DEPENDENCY in `otool -L MyApplication | sed 1d` 
do 
    ... 
done 

दिखाए जाने वाले परिणामों पंक्ति-दर-पंक्ति कार्रवाई करने के लिए क्या है?

उत्तर

23

आप read आदेश का उपयोग करना चाहिए।

otool -L MyApplication | sed 1d | \ 
while read i 
do 
    echo "line: " $i 
done 

पढ़ने builtin का विवरण, और इसके विकल्प के लिए bashref देखें। for के साथ read का उपयोग करने के उदाहरणों के लिए आप निम्नलिखित tutorial पर भी देख सकते हैं।

+7

चेतावनी: अगर आप थोड़ी देर के पाश में चर सेट करने के लिए (यानी की दुकान क्या आप otool के उत्पादन में पाया) की जरूरत है, वे क्योंकि यह हिस्सा है पाश बाहर निकलता है जैसे ही गायब हो जाएगा एक पाइपलाइन का और इसलिए एक सबहेल में चलाता है। बाश में, आप इसे फिर से व्यवस्थित करने के साथ मिल सकते हैं: 'जबकि मैं पढ़ता हूं; करें ... किया <<(otool -L MyAplication | sed 1d) ' –

+1

एक और चेतावनी: यह बहुत सी जगहों और बैकस्लाश को हटा देगा। इस तरह के संशोधनों के बिना लाइन पढ़ने के लिए 'read -r i'' का उपयोग करें। – Jens

+0

@ जेन्स, नहीं, यह इको कमांड खाने की जगह है। 'echo "पंक्ति: $ i" 'इसे रोक देगा। –

0

आप awk का प्रयोग कर एक प्रति-लाइन के आधार पर चीजों को कार्रवाई करने के लिए कर सकते हैं। वास्तव में सबसे अच्छा तरीका क्या है जो आप करने की कोशिश कर रहे हैं पर निर्भर करता है।

7
otool -L MyApplication | sed 1d | while read line ; 
do 
    # do stuff with $line 
done 
3

आंतरिक फील्ड सेपरेटर को एक नई लाइन में बदलने का प्रयास करें। डिफ़ॉल्ट रूप से, लूप के लिए उपयोग करते समय बाश रिक्त स्थान से टोकन को अलग करने जा रहा है। आपकी आईएफएस सेटिंग लूप को जो भी स्ट्रिंग आईएफएस बराबर है, इस आधार पर टोकन को विभाजित करेगी (इस प्रकार रिक्त स्थान पर टोकन के बजाए नई लाइनों द्वारा सूची टोकन को विभाजित करें)।

[bash ] $ IFS=" 
" 
[bash ] $ for DEPENDENCY in `otool -L MyApplication | sed 1d` 
do 
    .... 
done 
0

आप इसे भी अजीब कर सकते हैं। पाश

otool -L MyApplication | awk 'NR>1 
{ 
    # do your stuff here since awk process line by line. 
}' 
0

के लिए एक पार्टी का उपयोग करने के लिए कोई ज़रूरत नहीं आप read builtin खोल उपयोग करने के लिए है, लेकिन लाइनों रिक्त स्थान और टैब युक्त के साथ सावधान रहना। मैं स्थानीय रूप से सुझाव है $IFS के परिवर्तन मूल्य:

otool -L MyApplication | sed 1d | \ 
while IFS= read i; do 
    echo "line: " $i 
done 
संबंधित मुद्दे