bash循环中的exec命令用于webscrapping

拉基卜·菲哈(Rakib Fiha)

这是一个简单的脚本,它可以卷曲https://unix.stackexchange.com/并将结果存储到数组中,效果很好。

#!/usr/local/bin/bash
[ -f pgtoscrap ] && { rm pgtoscrap; };
curl -o pgtoscrap https://unix.stackexchange.com/;
declare -a arr;
fileName="pgtoscrap";

exec 10<&0
exec < $fileName
let count=0
while read LINE; do
    arr[$count]=$LINE
    ((count++))
done
exec 0<10 10<&-

但是,每次我运行此脚本时;错误的文件描述符出现一些错误。

./shcrap
./shcrap: line 14: 10: No such file or directory

我想我不太了解如何exec正确地在循环中使用命令。有人可以解释吗?

-在实施mapfileBash 4之后进行更新,它变得更加简单-

#!/usr/local/bin/bash
## Pass a parameter as e.g. ./linkscrapping.bash https://unix.stackexchange.com/
mapfile -t arr < <(curl -s $1); ## Doing exec stuff with process substitution
regex="<a[[:print:]]*<\/a>"; ELEMENTS=${#arr[@]}; firstline=0;
for((i=0;i<$ELEMENTS;i++)); do
    if [[ ${arr[${i}]} =~ $regex ]]; then
    [[ $firstline<1 ]] &&
        { echo ${BASH_REMATCH[0]} > scrapped; let firstline=$firstline+1; } ||
        { echo ${BASH_REMATCH[0]} >> scrapped; }
    fi
done
pg2scrap="scrapped"; mapfile -t arr2 < <(cat $pg2scrap);
regex="href=[\"\'][0-9a-zA-Z\:\/\.]+"; ELEMENTS2=${#arr2[@]}; line2=0
for ((i=0;i<$ELEMENTS2;i++)); do
    if [[ ${arr2[${i}]} =~ $regex ]]; then
    [[ $line2<1 ]] &&
        { echo ${BASH_REMATCH[0]#href=\"} > links; (( line2++ )); } ||
        { echo ${BASH_REMATCH[0]#href=\"} >> links; }
    fi
done; cat links;
伊尼安

当然,这与您如何关闭先前为stdin打开的文件描述符有关。使用以下应该很好

exec 10<&- 

当您这样做时0<10,您指示外壳程序10在当前目录中命名的文件的内容中寻找和吸收它,在这种情况下这是没有意义的。

在中,bash您还可以使用另一种形式exec 10>&-来达到关闭描述符的相同目的。

但这就是说,您不需要使用exec随机文件描述符并读取输入,您可以使用以下bash形式的流程替换技术读取您的输入< <()

while IFS= read -r line; do
    arr["$count"]="$line"
    ((count++))
done< <(pgtoscrap)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在循环中调用 ssh 命令时 bash 循环中断

来自分类Dev

bash shell循环中的grep命令

来自分类Dev

Bash:在for循环中找不到命令

来自分类Dev

bash-在循环中停止命令,但继续循环

来自分类Dev

Bash exec在无限while循环中不起作用

来自分类Dev

如何在bash的for循环中使用命令的输出?

来自分类Dev

Bash rm命令无法从内部循环中运行

来自分类Dev

在for循环中使用命令行参数(bash)

来自分类Dev

在bash中的while循环中添加超时命令时出错

来自分类Dev

将几个结尾的Bash参数作为for循环中的命令

来自分类Dev

bash echo命令在功能循环中被忽略

来自分类Dev

在bash中的while循环中添加超时命令时出错

来自分类Dev

Bash在for循环中运行字符串格式的命令

来自分类Dev

在bash循环中执行时找到“找不到命令”

来自分类Dev

在 bash for 循环中使用命令替换

来自分类Dev

GREP命令在循环中

来自分类Dev

tar命令在for循环中

来自分类Dev

Bash变量在for循环中

来自分类Dev

bash 循环中的 awk

来自分类Dev

exec命令bin bash

来自分类Dev

在bash中将for循环变量用于其他命令

来自分类Dev

for循环中的命令替换无效

来自分类Dev

在for循环中评估unix命令

来自分类Dev

在for循环中追加命令输出

来自分类Dev

For循环中的Tkinter按钮命令

来自分类Dev

NODEjs在for循环中同步exec语句

来自分类Dev

在Ruby循环中运行几个“ exec”

来自分类Dev

在循环中运行“Runtime.getRuntime().exec()”

来自分类Dev

如何从bash的if循环中“突破”?