2013-07-16 71 views
8

我想出了一個很酷的腳本,它將生成我需要的輸出,但它只顯示在屏幕上,所以我必須複製,然後粘貼命令才能讓它們執行。這裏是我的腳本的簡化版本:我可以使用ECHO執行命令嗎?

#!/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匹配在列表中,讓我們說亞美尼亞和巴西,我會看到這樣的輸出到shell窗口:

/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命令來運行,並在列表中阻止(僅限且僅限)符合國名的行中的IP。

我已經嘗試了各種有限的shell腳本知識,但到目前爲止,似乎沒有任何工作。那麼是否有ECHO的一些選擇,我錯過了實際運行命令而不是僅僅打印出該行?

+0

我回滾您對問題本身的答案的包容性。請張貼您自己的答案或批准現有的答案之一。請注意,您的解決方案與Flo Doe的答案几乎完全相同。 –

回答

8

一個不需要修改腳本的簡單方法就是將命令的輸出傳遞給另一個bash實例。就像這樣:

yourscript | bash - 

-是告訴bash,它應該從stdin讀取命令。


但是,如果您不是在尋找快速解決方案,也可以動態構建和執行命令。就像這樣:

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

# ... and so on 

# now execute it: 
$cmd 
+1

你也可以將'for'循環放入'bash'中:'for x in ...;做...;完成| 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

這裏有一個bash內建的eval,它執行的命令就像他們在shell中輸入的一樣。例如你的腳本中,你可以做到以下幾點:

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

這將處理您的迴音在子shell和你一樣在你的shell,然後輸入鍵入它的輸出將被執行。

參見下面exerpt從bash的手冊:

EVAL [ARG ...] 參數被讀取並連接成一個命令。該命令然後由shell讀取並執行,並且其退出狀態返回爲eval的值 。如果沒有指定參數時,或僅空參數,EVAL返回0

0
echo `pwd` 

上面的命令對我的作品。

1

只要把你的命令到paranthesis這樣的:

echo $(ls) 
相關問題