循环(可能)多个参数

时间:2012-12-15 02:12:42

标签: bash

我写了一个小的bash脚本来检查网站是否已启动(使用isup.me)。它当前工作(在终端我叫“sh isup.sh stackoverflow.com”)。我希望能够做的是调用“sh isup.sh stackoverflow.com someother.site”(两个参数)并循环输出每个参数。 这是我的代码:

#!/bin/bash
theSite=$1
curl isup.me/$theSite | grep 'just' | sed s'/<a href="//' | sed s'/" class="domain">//' | sed s'/<\/a>//' | sed s"/http:\/\/$theSite//" | sed s'/<\/span>//'

我的另一个(非关键)问题是:我可以摆脱卷曲函数的“%Total%Received%Xferd Average Speed Time Time Time Current”位吗?

3 个答案:

答案 0 :(得分:5)

循环遍历$@数组将为您提供从第一个开始的参数。

for theSite
do
  ...
done

请注意,默认for遍历$@

-s参数将告诉cURL保持沉默。

答案 1 :(得分:2)

curl接受多个网址,因此您只需构建列表并执行单个命令即可。您可以使用parameter expansion完成此操作。另外,您不需要使用所有这些管道。您可以使用单个gsed或awk命令修改整个事物。这是我写它的方式:

#!/bin/bash

curl -s "${@/#/http://isup.me/}" |
    awk -F '[<>]' '/just/{
        sub("http://", "", $3);
        print $3 $NF;
    }'

答案 2 :(得分:1)

一种方法是像这样循环......

#!/bin/bash

while (( "$#" )); do
    theSite=$1
    curl isup.me/${theSite} 2>/dev/null | grep 'just' | sed s'/<a href="//' | sed s'/" class="domain">//' | sed s'/<\/a>//' | sed s"/http:\/\/$theSite//" | sed s'/<\/span>//'
    shift
done

这会在仍然存在参数的情况下进行迭代,然后shift向左移动参数。

2>/dev/nullstderr重定向到/dev/null,因此您看不到“额外”输出。

Ignacio Vazquez-Abrams's answer中的for - 循环更好,因为您不会冒“忘记”shift并创建无限循环的风险。您应该使用该方法。

另一种方法是使用w3m呈现HTML并使脚本更简单:

#!/bin/bash

for theSite; do
    w3m -dump isup.me/${theSite} | grep "${theSite}"
done