我写了一个小的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”位吗?
答案 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/null
将stderr
重定向到/dev/null
,因此您看不到“额外”输出。
Ignacio Vazquez-Abrams's answer中的for
- 循环更好,因为您不会冒“忘记”shift
并创建无限循环的风险。您应该使用该方法。
另一种方法是使用w3m
呈现HTML并使脚本更简单:
#!/bin/bash
for theSite; do
w3m -dump isup.me/${theSite} | grep "${theSite}"
done