bash版本5.0.17的脚本问题;5.0.3

bash版本5.0.17的脚本问题;5.0.3,bash,Bash,我在Ubuntu上使用这个脚本&它工作得很好 status="$(curl -Is http://www.google.com | head -1)" validate=( $status ) if [ ${validate[-2]} == "200" ]; then echo "OK" else echo "NOT RESPONDING" fi 但当我在我的Raspberry Pi上运行它时,它会生成

我在Ubuntu上使用这个脚本&它工作得很好

status="$(curl -Is http://www.google.com | head -1)"
validate=( $status )
if [ ${validate[-2]} == "200" ]; then
   echo "OK"
else
   echo "NOT RESPONDING"
fi
但当我在我的Raspberry Pi上运行它时,它会生成以下错误:

validate: bad array index
[: ==: unary operator expected
我猜这是我试过的bash版本:

if [ "$ {validate [-2]"} == "200" ]; then
但它不起作用

myUbuntu bash version : 5.0.17
myRaspebbry PI bash version : 5.0.3

虽然这个答案不能解决Bash问题,但不需要使用任何shell特性*来获取HTTP状态代码
curl
可以为您提取它:

status=$(curl-o/dev/null-w“{http_-code}”http://www.google.com)
-o/dev/null
选项告诉它删除检索到的页面(“保存”到
/dev/null

-w
选项告诉它在打印响应后打印部分响应<代码>%{http_code}正是您所需要的

要阅读有关
curl
选项的更多信息,请在终端中键入
curl--help
,或在web上阅读



*除了在变量中捕获输出之外。

试试这个-在bash版本5.0.3上工作需要一个双braket[…]:

说明:

尝试此选项,但将其作为$bash file.sh运行:

IFS=' '
while sleep 1;
    do ip=$(printf "%d.%d.%d.%d\n" "$((RANDOM % 256))" "$((RANDOM % 256))" "$((RANDOM % 256))" "$((RANDOM % 256))")
        
        # display current IP
        echo $ip
        # get url status
        status="$(curl -Is http://ip | head -1)"
        
        # read line 
        read -a strarr <<<  "$status"

        # if: empty print error  
        # else: check for second value in arr and execute http command 
        if [[ -z "$status" ]]
            then
                echo "invalid entry or NOT RESPONDING: {$status}"
            else
                if [[ ${strarr[1]} == "200" ]]
                    then
                        echo "OK" info="$(http -h http://$ip)" 
                        echo -e "http://$ip \n\n$info " >> iplist.txt
                 fi        
        fi
done
IFS=''
而睡眠1;
do ip=$(printf“%d.%d.%d.%d\n”“$(随机%256))”“$(随机%256))”“$(随机%256))”“$(随机%256))”“$(随机%256))”
#显示当前IP
echo$ip
#获取url状态
status=“$(curl-Ishttp://ip |总目-1“
#读线
读取-a strarr iplist.txt
fi
fi
完成

您不需要引用
200
。您确实需要引用
${validate[-2]}
(即使这样,对于使用哪个版本的bash,这段代码也是非常挑剔的;我不推荐这样做)。请参阅。在5.0.0和5.0.16中工作正常。您是否验证了数组包含您认为它的功能?为了调试的目的。。。在
validate=($status)
add
typeset-p validate
(显示数组的内容)之后;如果数组为空,或者由
[-2]
引用的位置不存在,您将得到预期的
一元运算符
错误。。。这似乎支持了数组不包含您认为它所包含的内容的观点。。。这反过来又可能是一个问题,
curl
命令不能从树莓中正确执行……同样,脚本中
IFS
的当前值将改变任务分配到数组中的方式。这很好,但有一半是因为在现实中,我没有将google url放入一个随机生成IP的循环中&它测试每个IP是否有一个站点在后面&因此我有一个错误:validate:bad array index错误只发生在Raspberry Pi(Debian)上,而不是在带有UbuntuCan的桌面PC上。你能提供循环代码的完整工作副本吗?哦,不,我为国家安全局工作!只是开玩笑,我知道一点bash,但不像一个职业选手。这是代码:whilesleep 1;do ip=$(printf“%d.%d.%d.%d\n”“$((随机%256))”“$((随机%256))”“$((随机%256))”“$((随机%256))”)echo$ip status=“$(curl-Is http://$ip | head-1)”如果[${validate[-2]}=“200]”,则验证=($status);然后echo“OK”info=“$(http-hhttp://$ip)”echo-e“http://$ip\n\n$info”>>iplist.txt,否则echo“NOT response”fi doneI做了一些更改,但您需要显式地以“$bash file.sh”运行。bash 5.0.3有一些问题感谢您的帮助,但对于我所做的事情,您的回答不合适,我邀请您阅读我之前对Sergio Rodriguez的评论,您会理解的
IFS=' '
while sleep 1;
    do ip=$(printf "%d.%d.%d.%d\n" "$((RANDOM % 256))" "$((RANDOM % 256))" "$((RANDOM % 256))" "$((RANDOM % 256))")
        
        # display current IP
        echo $ip
        # get url status
        status="$(curl -Is http://ip | head -1)"
        
        # read line 
        read -a strarr <<<  "$status"

        # if: empty print error  
        # else: check for second value in arr and execute http command 
        if [[ -z "$status" ]]
            then
                echo "invalid entry or NOT RESPONDING: {$status}"
            else
                if [[ ${strarr[1]} == "200" ]]
                    then
                        echo "OK" info="$(http -h http://$ip)" 
                        echo -e "http://$ip \n\n$info " >> iplist.txt
                 fi        
        fi
done