解析error-icon类div元素时Grep报未识别选项错误求助
嘿,我一眼就瞅出你脚本里的问题啦——你把curl返回的HTML响应直接当作文件名传给grep了,这才触发了那个"unrecognized option '-->'"的错误!grep以为你要读取某个叫那堆HTML内容的文件,结果把内容里的-->当成了命令选项,自然就懵了。
问题根源
看你原来的这行代码:
output=$(grep -o '<div class="error-icon">[^<]*' "$response" | grep -o '[^>]*$')
这里的"$response"是curl返回的HTML文本,但grep的语法里,后面的参数如果是字符串,会被当作文件名来读取,而不是作为要处理的内容。当HTML里出现--开头的内容(比如注释里的-->),grep就会把它当成未识别的命令选项,直接报错。
另外还有个隐藏小问题:你用单引号包裹了--data-raw的内容,这会导致${verifyCard}变量无法被解析,脚本实际上是把字符串${verifyCard}传给了接口,而不是你传入的参数值。
修复方案
我们需要把curl的响应内容通过标准输入传给grep,同时修正参数传递的问题,有两种简单的方式:
方式1:用管道(echo + |)
把原来的output行改成:
output=$(echo "$response" | grep -o '<div class="error-icon">[^<]*' | grep -o '[^>]*$')
通过echo "$response"把内容输出到标准输出,再用管道|传给grep处理,这样grep就会读取标准输入里的HTML内容,而不是去查找不存在的文件。
方式2:用Here-string(<<<)
这是Bash/zsh里更简洁的写法,直接把变量内容传给grep的标准输入:
output=$(grep -o '<div class="error-icon">[^<]*' <<< "$response" | grep -o '[^>]*$')
更可靠的HTML解析建议
其实用grep处理HTML是非常脆弱的——如果页面的HTML结构稍微变化(比如class名前后加空格、标签换行),grep的正则就会失效。如果你的环境允许,推荐用专门的HTML解析工具,比如pup(一个基于Go的命令行HTML解析器):
# 先安装pup(比如Ubuntu下:sudo apt install pup) output=$(echo "$response" | pup '.error-icon text{}')
这样不管HTML怎么排版,都能精准提取到class为error-icon的元素里的文本内容,比grep靠谱多了!
完整修复后的脚本
#!/bin/sh verifyCard=$1 if [ -z "${verifyCard}" ]; then echo "No argument supplied" exit 1 fi response=$(curl 'https://www.isic.org/verify/' \ -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \ -H 'Accept-Language: en-US,en;q=0.5' --compressed \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Origin: https://www.isic.org' \ -H 'Connection: keep-alive' \ -H 'Referer: https://www.isic.org/verify/' \ -H 'Cookie: PHPSESSID=46plnh6b31e2pusv1do6thfbm7; AWSELB=AF73034F18B38D7DCED6DEDC728D31BA3F3A73F96747FEE7FA7C4F7A74BC9954E5928CBDDD5C053FFB2A37CE37136C4BA008B15163192B34CFA04D35BEC4ED0D0D2913A2FB; AWSELBCORS=AF73034F18B38D7DCED6DEDC728D31BA3F3A73F96747FEE7FA7C4F7A74BC9954E5928CBDDD5C053FFB2A37CE37136C4BA008B15163192B34CFA04D35BEC4ED0D0D2913A2FB; _ga=GA1.2.650910486.1600495658; _gid=GA1.2.731428038.1600495658; _gat=1' \ -H 'Upgrade-Insecure-Requests: 1' \ --data-raw "verify_card_number=${verifyCard}") # 这里用echo管道传递内容给grep output=$(echo "$response" | grep -o '<div class="error-icon">[^<]*' | grep -o '[^>]*$') echo "$output"
内容的提问来源于stack exchange,提问作者Zimice

