我创建了一个脚本,基本上可以获取url上的状态代码。如果状态代码大于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[@]}"
请帮帮我,我是noob。
当您将结果(例如,来自curl
调用(管道传输到另一个命令(例如,grep/awk/read
(时,您正在生成一个子shell;当子shell存在时,在子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的范围内可用 - 在一些变量引用周围添加双引号作为良好做法(例如,如果变量包含空白,如果变量为空(