Bash脚本将文字读作命令

时间:2017-10-13 14:59:45

标签: bash github terminal

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

1 个答案:

答案 0 :(得分:1)

我在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 substitute命令
  •   
  • / 开始匹配模式
  •   
  • [^:]* 匹配所有不是:
  • 的内容   
  • [^:]*匹配所有 :后跟 : *
  •   
  • [^:]*:[\ ]* 匹配所有 :后跟 : 后跟的所有内容 空格
  •   
  • [^:]*:[\ ]*\([^,]*\)匹配所有 : 后跟 : 后跟的所有内容 空格以及此处的 捕获所有 而不是,
  •   
  • [^:]*:[\ ]*\([^,]*\)匹配所有 : 后跟 : 后跟的所有内容 空格以及此处的 捕获所有 而不是, 停止捕获匹配 ,
  •   
  • /结束匹配模式,开始替换字符串
  •   
  • \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 }')