Bash 如何在shell中使用curl检查内容类型

Bash 如何在shell中使用curl检查内容类型,bash,shell,http,curl,Bash,Shell,Http,Curl,我想检查服务器中文件的内容类型。 以下代码始终回显图像大小无效 TYPE=$(curl -sI $IMAGE_LINK | grep Content-Type) IFS=" " set $TYPE echo $2 if [ $2 == "image/gif" ] then echo "image size is valid" exit 0 else echo "image size i

我想检查服务器中文件的内容类型。 以下代码始终回显图像大小无效

    TYPE=$(curl -sI $IMAGE_LINK | grep Content-Type)
    IFS=" "
    set $TYPE
    echo $2

    if [ $2 == "image/gif" ] 
    then
        echo "image size is valid"
        exit 0  
    else
        echo "image size is invalid"
        exit 1
    fi  
这是输出。为什么$2为image/gif时比较不起作用

image/gif
image size is invalid
另外,, 这是我不想要的解决方案

    TYPE=$(curl -sI $IMAGE_LINK | grep "Content-Type: image/gif")
    echo $TYPE

    if [ ! "$TYPE" = "" ]
您可以使用单个awk来提取内容类型标题,而不是grep和IFS、set等:

您可以使用单个awk来提取内容类型标题,而不是grep和IFS、set等:


这个比较不起作用,因为在$2结尾有一个拖尾回车。如果执行此操作,您可以看到它:

TYPE=$(curl -sI $IMAGE_LINK | grep Content-Type)
IFS=" "
set $TYPE
echo -n "$2" | od -t c
这将产生:

0000000    i   m   a   g   e   /   g   i   f  \r
0000012
此外,由于默认的IFS设置中包含空间,因此设置IFS并没有真正帮助您。您可以将IFS设置为包含回车IFS=$'\r',或者使用另一种方法解析出所需的位:

TYPE=$(curl -sI "$IMAGE_LINK" | grep Content-Type | tr -d '\r' | cut -f 2 -d ' ')
if [ "$TYPE" = "image/gif" ]
then
    echo 'It works!'
fi
或者,正如@DanielStenberg所建议的,甚至更好:

TYPE=$(curl -sI "$IMAGE_LINK" -w '%{content_type}' -o /dev/null)
if [ "$TYPE" = "image/gif" ]
then
    echo 'It works!'
fi

这个比较不起作用,因为在$2结尾有一个拖尾回车。如果执行此操作,您可以看到它:

TYPE=$(curl -sI $IMAGE_LINK | grep Content-Type)
IFS=" "
set $TYPE
echo -n "$2" | od -t c
这将产生:

0000000    i   m   a   g   e   /   g   i   f  \r
0000012
此外,由于默认的IFS设置中包含空间,因此设置IFS并没有真正帮助您。您可以将IFS设置为包含回车IFS=$'\r',或者使用另一种方法解析出所需的位:

TYPE=$(curl -sI "$IMAGE_LINK" | grep Content-Type | tr -d '\r' | cut -f 2 -d ' ')
if [ "$TYPE" = "image/gif" ]
then
    echo 'It works!'
fi
或者,正如@DanielStenberg所建议的,甚至更好:

TYPE=$(curl -sI "$IMAGE_LINK" -w '%{content_type}' -o /dev/null)
if [ "$TYPE" = "image/gif" ]
then
    echo 'It works!'
fi
提取Content-Type:header只需使用curl和

type=$(curl -sI "$IMAGE_LINK" -o/dev/null -w '%{content_type}\n')

if [ "$type" = "image/gif" ]
then
    echo "image type is valid"
    exit 0  
else
    echo "image type is invalid"
    exit 1
fi
提取Content-Type:header只需使用curl和

type=$(curl -sI "$IMAGE_LINK" -o/dev/null -w '%{content_type}\n')

if [ "$type" = "image/gif" ]
then
    echo "image type is valid"
    exit 0  
else
    echo "image type is invalid"
    exit 1
fi

在GNU grep上以PCRE模式使用grep作为grep-Po'?在GNU grep上以PCRE模式使用grep作为grep-Po'-也可以不使用awk进行检查。标题字段名称检查必须不区分大小写:type=$curl-sI$IMAGE\u LINK-w'{content\u type}\n'-o/dev/nullExcellent@DanielStenberg,您可以将其添加为答案。@DanielStenberg不知道curl有这个选项!很高兴知道!也可以在没有awk的情况下执行此操作。标头字段名称检查必须不区分大小写:type=$curl-sI$IMAGE\u LINK-w“{content\u type}\n'-o/dev/nullExcellent@DanielStenberg,您可以将其添加为答案。@DanielStenberg不知道curl有此选项!很高兴知道!