【问题标题】:How to loop through array items and pass each item to a function in bash如何遍历数组项并将每个项传递给bash中的函数
【发布时间】:2015-02-08 02:48:12
【问题描述】:

如何将数组中从索引/项 0 开始的单个项值传递给函数并循环遍历数组,直到所有项都被传递?

此脚本的目的是从名为 array_list 的文本文件中提取行并将它们传递到一个数组中,然后在循环中对每个数组项执行一个函数,直到所有项都已传递并将结果回显到名为的文本文件中results.txt 显示关联 URL 的 HTTP 状态代码

#!/bin/bash
#
#Script to lookup URL address and capture associated HTTP Status Code (EG: 200, 301, 400, 404,500, 503)
#
#
declare -a array
array=()
getArray()
    {
    i=0
    while read line
    do
        array[i]=$line
        i=$(($i + 1))
    done < $1
    }
getArray "array_list"
for url in ${array[@]}
do
    function call()
    {
        curl -s -o /dev/null -w "%{http_code}" $url
    }
done

response=$(call)

echo $url $response  >> result.txt

【问题讨论】:

  • 我不是 bash 大师,但看起来你用不同的 url 一次又一次地声明相同的函数。

标签: arrays bash loops


【解决方案1】:

这是一个循环,它多次定义函数curl,但从未调用它:

for url in ${array[@]}
do
    function call()
    {
        curl -s -o /dev/null -w "%{http_code}" $url
    }
done

你为什么要在这里使用函数并不明显。你可以这样做:

for url in ${array[@]}; do
  printf "%s " "$url" >> results.txt
  curl -s -o /dev/null -w "%{http_code}" "$url" >> results.txt
done

当然,你可以定义函数(接受一个参数):

function getfile() {
  curl -s -o /dev/null -w "%{http_code}" "$1"
}

然后循环调用:

for url in ${array[@]}; do
  result=$(getfile "$url")
  printf "%s %s\n" "$url" "$result" >> results.txt
done

与您的问题没有直接关系,但是:

你的整个 getArray 函数已经作为 bash 内置函数存在,所以你不妨直接使用它:

mapfiles -t array < array_list

请参阅help mapfiles 了解更多选项。

【讨论】:

  • 感谢 rici,我是新手,可能没有最佳实践。感谢您的回复。
【解决方案2】:

这是我为使其正常工作所做的更改。我也会尝试 rici 建议的方式。

#!/bin/bash
#Script to lookup URL address and capture associated HTTP Status Code (EG: 200, 301, 400, 404,500, 503)
#
declare -a array
array=()
getArray()
    {
    i=0
    while read line
    do
        array[i]=$line
        i=$(($i + 1))
    done < $1
    }
getArray "array_list"

count=${#array[@]}
index=0
while [ "$index" -lt "$count" ]
do
    #echo -e "index: $index\tvalue: ${array[$index]}"
    for url in ${array[$index]}
    do
         function call()
             {
                curl -s -o /dev/null -w "%{http_code}" $url
             }
    done
    response=$(call)
    echo $url $response  >> result
    let "index++"

done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2020-03-10
    • 2017-06-03
    • 2011-12-26
    相关资源
    最近更新 更多