1

我编写了一个小 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>//'

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

4

3 回答 3

5

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

for theSite
do
  ...
done

请注意,默认情况下会for循环$@.

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

于 2012-12-15T02:21:18.230 回答
2

curl接受多个 URL,因此您只需要构建列表并执行单个命令。您可以通过参数扩展非常简单地做到这一点。顺便说一句,您不需要使用所有这些管道。您可以使用单个 gsed 或 awk 命令修改整个内容。我会这样写:

#!/bin/bash

curl -s "${@/#/http://isup.me/}" |
    awk -F '[<>]' '/just/{
        sub("http://", "", $3);
        print $3 $NF;
    }'
于 2012-12-15T02:28:30.570 回答
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/null重定向stderr/dev/null,因此您看不到“额外”输出。

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

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

#!/bin/bash

for theSite; do
    w3m -dump isup.me/${theSite} | grep "${theSite}"
done
于 2012-12-15T02:19:24.887 回答