linux 元素未附加到块内的数组

gab6jxml  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(161)

我已经创建了一个脚本,基本上得到的状态码的网址。我试图添加状态码,如果它大于399。
元素被正确地附加到for循环块外部的数组中,但没有附加到循环块内部的数组中。(此处的数组是TP)

ARR=('http://google.com' 'https://example.org/olol' 'https://example.org' 'https://steamcommunity.com')
TP=()
TP+=("77")
ERROR=true

# for item in "${ARR[@]}";do curl -I $item | grep HTTP | awk '{print $2}'; sleep 3; echo $item; done;

for item in "${ARR[@]}";
        do curl -I $item | grep HTTP | awk '{print $2}'| { read message;
                echo "hi $message";
                TP+=("57")
                if [ $message -gt 399 ]; then
                        #TP+=("57");
                        ERROR=false;
                        echo "$message is greater";
                fi
        };
                sleep 2;
                echo $item;
done;

echo "${TP[@]}"

请帮帮忙,我是菜鸟。

g52tjvyc

g52tjvyc1#

当您将结果(例如,从curl调用)通过管道传递到另一个命令(例如,grep/awk/read)时,您正在生成一个子shell;当子外壳存在时,在子外壳内设置的任何变量都将“丢失”。
修复当前代码的一个想法是:

for item in "${ARR[@]}";
do
    read -r message < <(curl -I "$item" | awk '/HTTP/ {print $2}')
    echo "hi $message";
    TP+=("57")

    if [ "$message" -gt 399 ]
    then
        #TP+=("57")
        ERROR=false
        echo "$message is greater"
    fi

    sleep 2
    echo "$item"
done

其中:

  • curl|awk作为子shell被调用时,结果将被提供给当前/父shell中的read,因此message变量的内容在当前/父shell的作用域中可用
  • 在一些变量引用周围添加双引号作为良好做法(例如,在变量包含白色的情况下,在变量为空的情况下)

相关问题