2013-07-16 4 views
8

मैं एक अच्छी स्क्रिप्ट के साथ आया हूं जो मुझे आवश्यक आउटपुट का उत्पादन करेगा, लेकिन यह केवल स्क्रीन पर प्रदर्शित होता है, इसलिए मुझे कॉपी करना होगा, फिर उन्हें निष्पादित करने के लिए कमांड में पेस्ट करें। यहाँ मेरी स्क्रिप्ट के संक्षिप्त संस्करण है:क्या मैं आदेश निष्पादित करने के लिए ईसीएचओ का उपयोग कर सकता हूं?

#!/bin/bash 
runc=/etc/csf/csf.pl -d 
for IP in `tail -400 iptext.txt` 
do 
cc=`geoiplookup $IP` 
echo -e $runc $IP $cc | grep Algeria 
echo -e $runc $IP $cc | grep Argentina 
echo -e $runc $IP $cc | grep Armenia 
echo -e $runc $IP $cc | grep Azerbaijan 
echo -e $runc $IP $cc | grep Bolivia 
echo -e $runc $IP $cc | grep Brazil 
done 

ठीक है, तो यह प्रत्येक पर iptext.txt में IP पतों की सूची के माध्यम से लूप होता है, तो करता है एक GeoIP देखने, अगर (इस उदाहरण में) वहाँ दो हैं GeoIP से मेल खाता है सूची में, मैं खोल खिड़की करने के लिए इस तरह उत्पादन देखेंगे के आर्मेनिया और ब्राजील के लिए मान लीजिए,:

/etc/csf/csf.pl -d 46.162.242.17 GeoIP Country Edition: AM, Armenia 
/etc/csf/csf.pl -d 200.147.38.50 GeoIP Country Edition: BR, Brazil 

यह महान है, लेकिन मैं सिर्फ उत्पादन की तुलना में अधिक चाहते हैं, मैं वास्तव में /etc/csf/csf.pl -d आदेश चलाना चाहते हैं, और सूची में देश के नाम से मेल खाने वाली लाइनों में आईपी (केवल और केवल) ब्लॉक करें।

मैंने शैल स्क्रिप्टिंग के सीमित ज्ञान के साथ विभिन्न चीजों की कोशिश की है, लेकिन अब तक, कुछ भी काम नहीं करता है। तो क्या ईसीएचओ के लिए कुछ विकल्प है जो मुझे याद आ रही है जो वास्तव में लाइन को प्रिंट करने के बजाए कमांड चलाएगी?

+0

मैं सवाल अपने आप में एक जवाब के अपने शामिल किए जाने के रोलबैक की है। कृपया अपना उत्तर पोस्ट करें या मौजूदा में से एक को स्वीकृति दें। ध्यान दें कि आपका समाधान फ्लो डो के जवाब के लगभग समान था। –

उत्तर

8

एक आसान तरीका है कि आपकी स्क्रिप्ट के संशोधन की आवश्यकता नहीं होगी, कमांड के आउटपुट को दूसरे बैश इंस्टेंस में पाइप करना होगा। इस तरह:

yourscript | bash - 

- बैश कि यह stdin से आदेशों को पढ़ना चाहिए बताता है।


हालांकि, यदि आप त्वरित समाधान की तलाश नहीं कर रहे हैं, तो गतिशील रूप से कमांड को बनाना और निष्पादित करना भी संभव है। इस तरह:

cmd="ls" 
if [ "foo" != "bar" ] ; then 
    cmd="$cmd -a" 
then 

# ... and so on 

# now execute it: 
$cmd 
+1

आप 'for' लूप को 'bash' में भी पाइप कर सकते हैं:' x में ... के लिए; कर ...; किया bash -' –

+0

@glennjackman मुझे यकीन नहीं था और परीक्षण करने के लिए बहुत आलसी था;) ... लूप के आउटपुट को पाइप करना मेरे लिए सबसे अच्छा समाधान की तरह लगता है। धन्यवाद – hek2mgl

7

आप eval उपयोग कर सकते हैं एक स्ट्रिंग निष्पादित करने के लिए:

eval $cmdstring 
0

उपयोग grep -E और इसके बजाय एक पैटर्न:

$runc $IP $cc | grep -E 'Algeria|Argentina|...' 

स्पष्टीकरण: echo आदेश प्रिंट होगा लेकिन अमल नहीं यह। वास्तव में कमांड को निष्पादित करने के लिए इसे छोड़ दें।

और स्क्रिप्ट को 5 बार चलाने के बजाय, एक बार में पांच पैटर्न में से किसी एक को खोजने के लिए grep का उपयोग करें।

और तुम बैकटिक के बजाय

cc=$(geoiplookup $IP) 

का उपयोग करना चाहिए; यह सुरक्षित है।

5

एक बैश बिल्टिन eval है, यह आदेशों को निष्पादित करता है जैसे वे आपके खोल में टाइप किए गए थे।

eval $(echo -e $runc $IP $cc | grep Algeria) 

यह एक subshell में अपनी गूंज पर कार्रवाई करेंगे और इस तरह आप इसे अपने खोल में प्रवेश के बाद में टाइप उत्पादन निष्पादित किया जाएगा: अपनी स्क्रिप्ट के भीतर उदाहरण के लिए आप निम्न कर सकते हैं।

बैश पुस्तिका से exerpt नीचे देखें:

eval [आर्ग ...] तर्कों को एक ही कमांड में एक साथ पढ़ा और संयोजित किया जाता है। यह आदेश तब खोल द्वारा पढ़ा और निष्पादित किया जाता है, और इसकी निकास स्थिति के रूप में वापस आती है। कोई आर्ग, या केवल अशक्त तर्क नहीं हैं, तो eval रिटर्न 0.

0
echo `pwd` 

मेरे लिए आदेश काम करता है इसके बाद के संस्करण।

1

बस इस तरह paranthesis में अपने आदेश रखा:

echo $(ls) 
संबंधित मुद्दे

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