当我在 bash 中运行这个条件时:
if [ "$(curl 'https://api.github.com/repos/MyUserName/MyRepo/releases/latest' | grep 'prerelease')" == " """prerelease""": false" ] ; then
let ISPRERELEASE=false
fi
ISPRERELEASE 仍然是真的,即使它应该是假的。当我只运行条件语句时,我得到的错误表明"预发行版":false 是找不到命令。 为什么终端认为这是一个命令? 另外,我该如何修复我的代码,以便在满足条件时将ISPRERELEASE设置为false?
我在github上设置了一个测试存储库,这样你就可以实际测试事情而不是猜测它们。
步骤 1
curl -s 'https://api.github.com/repos/safai-labs/foo/releases/latest' | grep 'prerelease'
输出:
"prerelease": false,
注意空格,我们只需要最后的false
,所以:
第 2 步:
curl -s 'https://api.github.com/repos/safai-labs/foo/releases/latest' | sed -n '/prerelease/{ s/[^:]*:[ ]*([^,]*),/1/; p }'
输出:
false
解释
sed -n '/prerelease/{ s/[^:]*:[ ]*([^,]*),/1/; p }'
-n
:禁止 sed 打印行的默认行为,并且您必须明确告诉 sed 打印某些内容。
/prerelease/
将{ }中的规则应用于与正则表达式匹配的行
s/[^:]*:[ ]*([^,]*]),/1/
s
:sed 替换命令/
开始匹配模式[^:]*
匹配所有不是:
的东西[^:]*
:匹配所有不是:
的内容,后跟一个:
*[^:]*:[ ]*
匹配所有不是:
的内容,后跟一个:
,后跟空格[^:]*:[ ]*([^,]*)
:匹配所有不是:
的内容,后跟一个:
,后跟空格,从这里开始捕获所有不是,
[^:]*:[ ]*([^,]*)
:匹配所有不是:
的东西,后跟一个:
,然后是空格,从这里开始捕获所有不是,
的东西,停止捕获,匹配下一个,
,/
结束匹配模式,开始替换字符串- )
1
-替换与捕获的所有内容匹配的所有内容(在本例中为false
/
- 结束替换字符串;
-下一个命令p
- 打印修改后的行
第 3 步:
现在来看我们if
声明:
if [ $(curl -s 'https://api.github.com/repos/safai-labs/foo/releases/latest' | sed -n '/prerelease/{ s/[^:]*:[ ]*([^,]*),/1/; p }') = false ] ; then
echo "No prerelease found"
else
echo "In prerelease"
fi
更好的步骤 3
PRERELEASE=$(curl -s 'https://api.github.com/repos/safai-labs/foo/releases/latest' | sed -n '/prerelease/{ s/[^:]*:[ ]*([^,]*),/1/; p }')