如何遍历数组项并将每个项传递给bash中的函数

时间:2015-02-08 02:48:12

标签: arrays bash loops

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

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

#!/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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

以下是我为使其发挥作用所做的更改。我会尝试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