Bash 脚本将文字读取为命令



当我在 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/

  • ssed 替换命令
  • /开始匹配模式
  • [^:]*匹配所有不是:的东西
  • [^:]*匹配所有不是:的内容后跟一个:*
  • [^:]*:[ ]*匹配所有不是:的内容后跟一个:,后跟空格
  • [^:]*:[ ]*([^,]*)匹配所有不是:的内容后跟一个:,后跟空格从这里开始捕获所有不是,
  • [^:]*:[ ]*([^,]*)匹配所有不是:的东西后跟一个:,然后空格从这里开始捕获所有不是,的东西,停止捕获匹配下一个,
  • /结束匹配模式,开始替换字符串
  • 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 }')

最新更新