在 Bash for 循环中增加变量

在 Bash for 循环中增加变量

尝试创建一个脚本,用于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

相关内容