如何运行'done<&书信电报;(curl-sL file.txt);`在ksh的旧版本(1993-12-28)中,还是更新到bash?

如何运行'done<&书信电报;(curl-sL file.txt);`在ksh的旧版本(1993-12-28)中,还是更新到bash?,bash,curl,ksh,Bash,Curl,Ksh,我有一个脚本,可以在所需的许多服务器上完美地运行。但最近它在使用旧ksh版本的服务器上失败了 你能帮我修一下这条有问题的线吗 #!/bin/ksh SUCCESS=0 FAILURE=0 while read IP do CURL=$(curl -s -m 2 -x http://$IP -L http://icanhazip.com) if [[ "${IP%%:*}" == "${CURL%%:*}" ]] ; then SUCCESS=$[SUCCESS+

我有一个脚本,可以在所需的许多服务器上完美地运行。但最近它在使用旧ksh版本的服务器上失败了

你能帮我修一下这条有问题的线吗

#!/bin/ksh
SUCCESS=0
FAILURE=0
while read IP
do
    CURL=$(curl -s -m 2 -x http://$IP -L http://icanhazip.com)
    if  [[ "${IP%%:*}" == "${CURL%%:*}" ]] ; then
        SUCCESS=$[SUCCESS+1]
        echo "$IP   ✓"
    else
        FAILURE=$[FAILURE+1]
        echo "$IP   X"
    fi
done < <(curl -sL vpn-proxy-list.txt);
echo "✓: $SUCCESS   X: $FAILURE"
#/bin/ksh
成功=0
失败=0
读IP时
做
CURL=$(CURL-s-m2-x2-xhttp://$IP-Lhttp://icanhazip.com)
如果[[“${IP%%:*}”==“${CURL%%:*}”];然后
SUCCESS=$[SUCCESS+1]
echo“$IP✓"
其他的
失败=$[失败+1]
echo“$IP X”
fi

完成<您可以使用命名管道

mkfifo foobar
curl -sL vpn-proxy-list.txt > foobar &
# Maybe sleep for a while here
while read -r IP; do
  # do something here
done < foobar
rm foobar
mkfifoobar
curl-sL vpn-proxy-list.txt>foobar&
#也许在这里睡一会儿
在读时-r IP;do
#在这里做点什么
完成
您可以使用命名管道

mkfifo foobar
curl -sL vpn-proxy-list.txt > foobar &
# Maybe sleep for a while here
while read -r IP; do
  # do something here
done < foobar
rm foobar
mkfifoobar
curl-sL vpn-proxy-list.txt>foobar&
#也许在这里睡一会儿
在读时-r IP;do
#在这里做点什么
完成
如果在子shell中运行,则在while主体中似乎没有做任何会导致问题的事情,因此我只使用普通管道:

#!/bin/ksh

curl -sL vpn-proxy-list.txt | while read -r ip; do
    output=$(curl -s -m 2 -x "http://$ip" -L http://icanhazip.com)
    if  [[ "${ip%%:*}" == "${output%%:*}" ]]; then
        echo "$ip   Y"
    else
        echo "$ip   X"
    fi
done

现在,您正在询问一些中断的问题,因为您正在子shell中进行变量更改,而这些变量在子shell退出时消失。解决方法:使用大括号分组

curl -sL vpn-proxy-list.txt | {
    success=0
    failure=0
    while read -r ip; do
        output=$(curl -s -m 2 -x "http://$ip" -L http://icanhazip.com)
        if  [[ "${ip%%:*}" == "${output%%:*}" ]]; then
            echo "$ip   Y"
            let success+=1
        else
            echo "$ip   X"
            let failure+=1
        fi
    done
    echo there were $success successes
    echo there were $failure failures
}
# variables "success" and "failure" don't exist here.

如果在子shell中运行,那么您在while主体中似乎没有做任何会导致问题的事情,因此我只使用一条简单的管道:

#!/bin/ksh

curl -sL vpn-proxy-list.txt | while read -r ip; do
    output=$(curl -s -m 2 -x "http://$ip" -L http://icanhazip.com)
    if  [[ "${ip%%:*}" == "${output%%:*}" ]]; then
        echo "$ip   Y"
    else
        echo "$ip   X"
    fi
done

现在,您正在询问一些中断的问题,因为您正在子shell中进行变量更改,而这些变量在子shell退出时消失。解决方法:使用大括号分组

curl -sL vpn-proxy-list.txt | {
    success=0
    failure=0
    while read -r ip; do
        output=$(curl -s -m 2 -x "http://$ip" -L http://icanhazip.com)
        if  [[ "${ip%%:*}" == "${output%%:*}" ]]; then
            echo "$ip   Y"
            let success+=1
        else
            echo "$ip   X"
            let failure+=1
        fi
    done
    echo there were $success successes
    echo there were $failure failures
}
# variables "success" and "failure" don't exist here.

如果您将
curl-sL vpn proxy list.txt的输出存储为变量,然后将该变量传递给while循环,那么它是否有效?这可能是在旧的Unix行上,如AIX、HP、Sun?查找ksk93或/usr/???/dtksh。当然,将#!/bin/ksh更改为匹配。祝您好运。我更新了上面的脚本,以更好地反映我的a实际脚本。我在while循环中有计数器,需要在循环外打印。到目前为止,答案对于原始问题很有效,但在计算在while循环外访问的变量时失败。如果将
curl-sL vpn proxy list.txt的输出存储为变量,然后传递该v,是否有效可以改为while循环?可能这是在旧的Unix行上,如AIX、HP、Sun?查找ksk93或/usr/???/dtksh。当然,将#!/bin/ksh更改为匹配。祝你好运。我更新了上面的脚本以更好地反映我的实际脚本。我在while循环中添加了计数器,需要在循环外打印。answe到目前为止,rs对原始问题很有效,但在计算在while循环之外访问的变量时失败。前面加了
#!/bin/ksh
?@Ryan您也可以添加shebang!我的错误,我没有注意到它是fifo。抱歉。好吧,我成功了,但现在我的计数器出现了问题(不是在原来的问题中,但却把我的剧本搞砸了)。我如何允许在while循环内使用计数器?并在while循环外打印这些计数器?以
#!/bin/ksh
为前缀?@Ryan您也可以添加shebang!我的错误,我没有注意到它是fifo。抱歉。好吧,我已经成功了,但现在我的计数器出现了问题(不是在原来的问题中,但却把我的剧本搞砸了)。我如何允许在while循环内使用计数器?以及在while循环外打印这些计数器?我也可以让它工作,但不幸的是,我无法访问while循环内的任何计数器。你能建议一种替代方法,允许在过程中建立一些统计数据吗?谢谢。工作性能良好Thy。我也能让它工作,但不幸的是,我无法访问while循环内的任何计数器,也无法访问while循环外的任何计数器。你能建议一个替代方案,允许在这一过程中建立一些统计数据吗?谢谢。工作得很好。