变量未正确回显,将其自身插入到另一个变量中

问题描述 投票:0回答:1

我对 bash 很陌生,我有一个任务,必须创建一个脚本来读取 url 并提取 http 代码、使用的编码和字数。除了字数之外,一切都运行良好:我测试了该命令,它在隔离时可以工作,但是当我将它存储在变量中并将其添加到回显末尾时,它似乎将自身插入到“http”的位置?更奇怪的是,对于一个 URL,它可以工作并显示在最后。我真的很迷失,我一直在试图理解出了什么问题,我确信答案是愚蠢而简单的,但我似乎不明白为什么。有人可以向我解释一下我做错了什么吗?

这是我的代码,我有一个变量“count”,它存储 wc 命令的结果。当我尝试使用一个网址隔离它时,它会起作用并显示数字。

#!/usr/bin/env bash

if [ $# -ne 1 ]
then
echo "Le script demande un argument"
exit 1
fi

urls=$1

if ! [[ $urls =~ ".txt"$ ]]
then
echo "Ce n'est pas un format valide"
exit 2
fi

i=1
while read -r line
do
code=$(curl -ILs "$line" | grep "HTTP/" | cut -d' ' -f2)
charset=$(curl -ILs "$line" | grep -i "Content-Type:" | cut -d" " -f3 | cut -d"=" -f2)
if [ -z "$charset" ]
then
charset="null"
fi
count=$(lynx "$line" -dump -nolist | wc -w)
printf '%s\t%s\t%s\t%s\t\n' "$line" "$code" "$charset" "$count"
i=$((i + 1))
done < "$urls"

这是我得到的:

 1       6401 ://fr.wikipedia.org/wiki/Robot     200     UTF-8
 2       1171 ://fr.wikipedia.org/wiki/Robot_de_cuisine          200     UTF-8
 3       1730 ://fr.wikipedia.org/wiki/Robot_d%27indexation      200     UTF-8
 4       2278 ://fr.wikipedia.org/wiki/Bot_informatique          200     UTF-8
 5       1157 ://fr.wikipedia.org/wiki/Atlas_(robot)     200     UTF-8
 6       https://roboty.magistry.fr      200     null    35 
 7       1618 ://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)          200     UTF-8
 8       4525 ://fr.wiktionary.org/wiki/robot    200     UTF-8
 9       1048 ://fr.wikipedia.org/wiki/Protocole_d%27exclusion_des_robots        200     UTF-8
 10      12985 //fr.wikipedia.org/wiki/Robotique         200     UTF-8

我希望插入到 url 中的数字(如 6401)位于末尾,就像第 6 行一样。

这是

bash -x
日志:

+ urls=./urls/fr.txt
+ [[ ./urls/fr.txt =~ \.txt$ ]]
+ i=1
+ read -r line
++ curl -ILs https://roboty.magistry.fr
++ grep HTTP/
++ cut '-d ' -f2
+ code=200
++ curl -ILs https://roboty.magistry.fr
++ grep -i Content-Type:
++ cut '-d ' -f3
++ cut -d= -f2
+ charset=
+ '[' -z '' ']'
+ charset=null
++ lynx https://roboty.magistry.fr -dump -nolist
++ wc -w
+ count=35
+ printf '%s\t%s\t%s\t%s\t\n' https://roboty.magistry.fr 200 null 35
https://roboty.magistry.fr      200     null    35
+ i=2
+ read -r line
++ curl -ILs 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)'
++ grep HTTP/
++ cut '-d ' -f2
+ code=200
++ curl -ILs 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)'
++ grep -i Content-Type:
++ cut '-d ' -f3
++ cut -d= -f2
+ charset=$'UTF-8\r'
+ '[' -z $'UTF-8\r' ']'
++ lynx 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)' -dump -nolist
++ wc -w
+ count=1618
+ printf '%s\t%s\t%s\t%s\t\n' 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)' 200 $'UTF-8\r' 1618
https://1618ikipedia.org/wiki/Robot_(Léonard_de_Vinci)  200     UTF-8
+ i=3
+ read -r line

我想这是因为 在“UTF-8”末尾?

如果您能帮助我,请先非常感谢

bash variables echo wc
1个回答
0
投票

你只需要清理新的行字符和类似的东西,这是我快速整理的更新版本。

#!/usr/bin/env bash

# Check if exactly one argument is provided
if [ "$#" -ne 1 ]; then
    echo "Le script demande un argument"
    exit 1
fi

urls_file="$1"

# Check if the provided argument is a .txt file
if [[ "$urls_file" != *.txt ]]; then
    echo "Ce n'est pas un format valide"
    exit 2
fi

# Check if the file exists and is readable
if [ ! -r "$urls_file" ]; then
    echo "Erreur : Le fichier '$urls_file' n'existe pas ou n'est pas lisible."
    exit 3
fi

# Initialize a counter (optional if tracking line numbers)
i=1

# Process each URL in the file
while IFS= read -r url ;do
#while read -r url; do
    # Skip empty lines
    if [ -z "${url}" ]; then
        continue
    fi

    # Get the HTTP status code
    code=$(curl -ILs "${url}" | grep -m 1 "HTTP/" | awk '{print $2}' | sed 's/[^0-9]//g')
    if [ -z "$code" ]; then
        code="null"
    fi

    # Get the charset from the Content-Type header
    charset="$(curl -ILs "${url}" | grep -i "Content-Type:" | cut -d':' -f2 | awk '{print $1}' | sed 's/[^a-zA-Z0-9:\/ ]//g' | tr -d '\n\r')"
    if [ -z "$charset" ]; then
        charset="null"
    fi

    # Count words on the page content using curl and wc
    count=$(curl -s "${url}" | wc -w | sed 's/[^0-9]//g')
    if [ -z "$count" ]; then
        count="null"  # Handle cases where curl fails to retrieve content
    fi
    # Print results in a tab-separated format
    echo "${url} $code $charset $count"

    # Increment the counter (optional)
    i=$((i + 1))
done < "$urls_file"

** 快速讨论:**

错误检查:

文本文件检查应该更加稳健,如果失败,我添加了一个附加检查,错误代码为 3。此外,您应该检查结果,如果失败,则应填充“null”字符串或“NA”等。您还应该跳过空行,我是用“继续”执行的。

变量命名:

还要处理变量命名,它应该尽可能地描述事物(例如 urls_file 是更好的描述)。

简化命令:

你不应该需要 lynx 来获得字数统计,我不知道你得到的字数统计是什么,所以我假设它是所有文本,而不仅仅是用户会看到的 html 单词。

© www.soinside.com 2019 - 2024. All rights reserved.