尝试创建一个脚本,用于curl
探测多个 URL 以获取更新信息。目前,我对每个 URL 使用单独的命令,我试图通过在循环中使用增量变量来缩短代码行数for
。我目前拥有的内容:(以虚拟 URL 为例)
#!/bin/bash
url01="https://askubuntu1.com"
url02="https://askubuntu2.com"
url03="https://askubuntu3.com"
url04="https://askubuntu4.com"
url05="https://askubuntu5.com"
for i in {01..05}
do
url=$((url$i))
curl $url 2>&1| grep 'askubuntu' >> output.txt
done &
错误输出:
第 10 行:https://askubuntu1.com:表达式语法错误(错误标记是“://askubuntu1.com”)
预期结果:
每个curl
查询的命令输入到 bash shell 中,然后通过管道grep
输出到“output.txt”。
curl “https://askubuntu1.com”
curl “https://askubuntu2.com”
.
.
curl “https://askubuntu3.com”
谢谢
答案1
该作业url=$((url$i))
试图url$i
评估算术表达式- 这在这里不合适。你可以做的是使用变量间接引用:
for url in url{01..05}
do
curl "${!url}" 2>&1| grep 'askubuntu' >> output.txt
done
但是使用数组可能更简洁:
#!/bin/bash
urls=(
"https://askubuntu1.com"
"https://askubuntu2.com"
"https://askubuntu3.com"
"https://askubuntu4.com"
"https://askubuntu5.com"
)
for url in "${urls[@]}"
do
curl "$url" 2>&1| grep 'askubuntu' >> output.txt
done
你也可以循环索引数组${!urls[@]}
- 它将为您提供所需的递增整数变量,从中可以构建一系列编号的输出文件,例如:
for i in ${!urls[@]}
do
printf -v output 'file%02d.txt' $((i+1))
curl "${urls[i]}" 2>&1 | grep 'askubuntu' > "$output"
done
这$((i+1))
是因为 bash 数组索引从0
- 开始,如果您不介意输出file00
通过,file04
那么您可以使用普通的$i
。
对于基于变量间接的版本,您可以执行以下任一操作
for i in {01..05}
do
url="url$i"
curl "${!url}" 2>&1| grep 'askubuntu' > "file${i}.txt"
done
或者
for url in url{01..05}
do
curl "${!url}" 2>&1| grep 'askubuntu' > "${url/#url/file}.txt"
done