jol*_*ols 20 linux printing shell scripting 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
Run Code Online (Sandbox Code Playgroud)
好吧,所以它遍历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
Run Code Online (Sandbox Code Playgroud)
这很好,但我想要的不仅仅是输出,我实际上想要/etc/csf/csf.pl -d命令运行,并在列表中阻止(仅和仅)与国家名称匹配的行中的IP.
由于我对shell脚本的了解有限,我尝试了各种各样的东西,但到目前为止,似乎没有任何工作.那么ECHO是否有一些选项我错过了实际运行命令而不仅仅是打印出来的?
hek*_*mgl 18
一种不需要修改脚本的简单方法是将命令的输出传递给另一个bash实例.像这样:
yourscript | bash -
Run Code Online (Sandbox Code Playgroud)
该-是告诉bash,它应该从stdin读取命令.
但是,如果您不是在寻找快速解决方案,那么也可以动态地构建和执行命令.像这样:
cmd="ls"
if [ "foo" != "bar" ] ; then
cmd="$cmd -a"
then
# ... and so on
# now execute it:
$cmd
Run Code Online (Sandbox Code Playgroud)
小智 9
只需将命令放入括号中,如下所示:
echo $(ls)
Run Code Online (Sandbox Code Playgroud)
您也可以在命令之前使用文本
echo "The date is $(date)"
Run Code Online (Sandbox Code Playgroud)
例如
echo "Enter Text Here $(Command Here)"
Run Code Online (Sandbox Code Playgroud)
有一个bash builtin eval,它执行类似于你在shell中键入的命令.例如,在您的脚本中,您可以执行以下操作:
eval $(echo -e $runc $IP $cc | grep Algeria)
Run Code Online (Sandbox Code Playgroud)
这将在子shell中处理你的echo,输出将像你在shell中键入它然后输入一样执行.
从bash手册中看到以下内容:
eval [arg ...] args被读取并连接成一个命令.然后shell读取并执行此命令,并将其退出状态作为eval的值返回.如果没有args或只有null参数,则eval返回0.