Bash脚本未正确检查null

Bash脚本未正确检查null,bash,jq,Bash,Jq,我有一个bash脚本: #! /bin/bash someId=$(curl -sk -H -X POST -d "fizzbuzz" "https://someapi.example.com/v1/orders/fire" | jq '.someId') if [ -z "$someId" ]; then echo "Order Placement failed; unable to parse someId fro

我有一个bash脚本:

#! /bin/bash

someId=$(curl -sk -H -X POST -d "fizzbuzz" "https://someapi.example.com/v1/orders/fire" | jq '.someId')

if [ -z "$someId" ]; then
  echo "Order Placement failed; unable to parse someId from the response"
  exit 1
fi

echo "...order $someId placed"
当我运行此命令时,会得到以下输出:

...order null placed
所以$someId是空的,但是……我不应该看到订单放置失败;无法从响应回显中解析someId


如何修改if[-z$someId];如果$someId为null,则有条件执行?

null字符串是一个空字符串-一个零字节字符串,即其中不包含任何字符的字符串。s=为变量s分配一个空字符串,就像s=或s=do一样

相比之下,s=null、s='null'或s=null则用四字节字符串null分配一个字符串,然后用一个文本NUL字符终止,就像所有C字符串一样。这些字符串不是test-z$s或[-z$s]检查的空字符串或空字符串:它没有零个字符;相反,它有四个,分别是n,u,l和l

要检测空字符串或非空字符串null,请改用:

if [ -z "$someId" ] || [ "$someId" = null ]; then
  echo "Order Placement failed; unable to parse someId from the response"
  exit 1
fi

空字符串是一个空字符串—一个零字节字符串,即一个不包含任何字符的字符串。s=为变量s分配一个空字符串,就像s=或s=do一样

相比之下,s=null、s='null'或s=null则用四字节字符串null分配一个字符串,然后用一个文本NUL字符终止,就像所有C字符串一样。这些字符串不是test-z$s或[-z$s]检查的空字符串或空字符串:它没有零个字符;相反,它有四个,分别是n,u,l和l

要检测空字符串或非空字符串null,请改用:

if [ -z "$someId" ] || [ "$someId" = null ]; then
  echo "Order Placement failed; unable to parse someId from the response"
  exit 1
fi
使用-exit status选项,如果最后一个输出值为false或null,则使jq具有非零退出状态

使用-exit status选项,如果最后一个输出值为false或null,则使jq具有非零退出状态


字符串null不是零长度,它是四个字节-z只检查长度为零的字符串。听起来您想要的更像[-z$someId]| |[$someId=null]将其拆分为两个独立的测试,以符合当前POSIX指南的方式;请参阅中的OB标记,将组合测试的其他方法标记为已过时。字符串null不是零长度,而是四个字节-z只检查长度为零的字符串。听起来您想要的更像[-z$someId]| |[$someId=null]将其拆分为两个独立的测试,以符合当前POSIX指南的方式;请参阅中的OB标记,将其他组合测试的方法标记为已过时。如果!someId=…?另外,jq-j或jq-r更适合传输someId内容,或者返回的值是JSON格式,这在大多数情况下不适合shell,比如JSON中的null是null关键字。如果!someId=…?另外,jq-j或jq-r更适合传输someId内容,或者返回的值是JSON格式,在大多数情况下不适合shell,比如JSON中的null是null关键字。