当我在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?
答案 0 :(得分:1)
我在github上设置了一个测试仓库,这样你就可以测试出来而不是猜测它们。
curl -s 'https://api.github.com/repos/safai-labs/foo/releases/latest' | grep 'prerelease'
输出:
"prerelease": false,
注意空格,我们最后只需要false
,所以:
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 substitute命令/
开始匹配模式- 的内容
[^:]*
匹配所有不是:
[^:]*
:匹配所有:
,后跟:
*[^:]*:[\ ]*
匹配所有:
,后跟:
后跟的所有内容 空格[^:]*:[\ ]*\([^,]*\)
:匹配所有:
后跟:
后跟的所有内容 空格,以及此处的 捕获所有 而不是,
强>[^:]*:[\ ]*\([^,]*\)
:匹配所有:
后跟:
后跟的所有内容 空格,以及此处的 捕获所有 而不是,
,停止捕获,匹配,
,/
结束匹配模式,开始替换字符串\1
- 替换与捕获的所有内容匹配的所有内容(在本例中为false
)/
- 结束替换字符串;
- 下一个命令p
- 打印修改后的行
<击> 撞击>
<击>现在我们的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
击> <击> 撞击>
PRERELEASE=$(curl -s 'https://api.github.com/repos/safai-labs/foo/releases/latest' | sed -n '/prerelease/{ s/[^:]*:[\ ]*\([^,]*\),/\1/; p }')