网址中命令中的数组变量

时间:2018-09-01 12:23:22

标签: bash

我在bash脚本中的网址格式有问题。在下面的代码url请求中:

text="$(lynx --dump https://address/"${array[${i}]}")"

返回 HTTP错误400。请求URL无效。我认为

"${array[${i}]}"

网址部分有问题。但是我不知道什么是正确的格式。

#!/bin/bash

saveIFS="$IFS"
IFS=$'\n'
array=($(<words))
IFS="$saveIFS"

elements=${#array[@]}

for (( i=0;i<$elements;i++))
do
    text="$(lynx --dump https://address/"${array[${i}]}")"

    echo "$text" >> "outputfilename"
fi
done

我也尝试过:

text="$(lynx --dump https://address/${array[${i}]})"

4 个答案:

答案 0 :(得分:2)

尝试

#!/bin/bash

IFS=$'\n' read -rd '' -a array <words
elements=${#array[@]}

for (( i=0;i<$elements;i++))
do
    text="$(lynx --dump https://address/"${array[${i}]}")"
    echo "$text" >> "outputfilename"
done


  • 未使用array=($(<words))设置数组变量
  • 您可以使用readreadarray,但是此示例与read一起使用

偶然地,将IFS=$'\n'放在read之前而没有命令分隔符;仅将$IFS设置为读取命令,从而省去了保存和重新设置{{1 }}

答案 1 :(得分:1)

您根本不需要数组;假设您每行只有一个URL组件,那么以下内容就可以在任何POSIX兼容的外壳程序中使用:

while IFS= read -r line; do
  text=$(lynx --dump https://address/"$line")
  echo "$text"
done < words >> output filename

答案 2 :(得分:1)

我的两分钱...

我更喜欢使用printf -v,它可以像 filter 一样构建:

catWeb() {
    while IFS= read -r word;do
        printf -v url "https://address/%s" "$word"
        lynx --dump "$url"
    done
}
catWeb <words >outputfilename

答案 3 :(得分:0)

我正在读取Windows文件。行以CR LF结尾。所以地址包含

\r

字符。我可以删除它:

array[${i}]=${array[${i}]%$'\r'}

或者我可以重新格式化输入文件,使行仅以LF结尾。

从CR LF文件读取工作脚本的主要结构是

#!/bin/bash

IFS=$'\n' read -rd '' -a array <words
elements=${#array[@]}

for (( i=0;i<$elements;i++))
do
   array[${i}]=${array[${i}]%$'\r'}
   text="$(lynx --dump https://adrress/"${array[${i}]}")"

if [ ${#text} -gt 1 ]
then
    echo "$text" >> "filename"
else
    echo "${array[${i}]}" >> "filename2"
fi
done