我真的很喜欢@Michel的建议。有时,您实际上可能只是提取一些变量值以使用BASH在该特定服务器中执行任务。因此,所需变量是已知的。这种使用这种方法的方法是避免或多次调用jq来为每个变量设置值的方法,或者甚至避免将read语句与多个变量一起使用,其中一些变量可以是有效的并且为空,从而导致值移位(这是我的问题)
如果.svID [] .ID =“”(sv将获取slotID值,则我以前的方法将导致值转换错误
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
如果您使用curl下载对象,这是我的方法,可以将一些变量重命名为友好名称,以便从数据数组中提取数据
使用eval和filter可以解决这一问题,只需一行,并将产生具有所需名称的变量
eval "$(jq -r '.[0] | {varNameExactasJson, renamedVar1: .var1toBeRenamed, varfromArray: .array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries | .[] | .key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"
在这种情况下,优点是可以在第一步中过滤,重命名和格式化所有所需变量。观察其中有。[0] | 如果源来自使用GET的RESTFULL API服务器,则响应数据为:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
如果您的数据不是来自数组,即。是一个像这样的对象:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
只需删除初始索引:
eval "$(jq -r '{varNameExactasJson, renamedVar1: .var1toBeRenamed, varfromArray: .array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries | .[] | .key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"
这是一个古老的问题,但是我感到很难分享,因为很难找到
declare -- “$key=$value”
并使用$AUTHOR
原来的方法使etc起作用,而无需使用数组。它仍然比eval更安全,尽管更改PATH
或更改的可能性仍然比此版本小。