Shell脚本- IFS在字符串包含连字符后停止

ih99xse1  于 2023-03-19  发布在  Shell
关注(0)|答案(2)|浏览(131)

我正在写shell脚本,将从以下结构vars.txt获得键值:[{"key":"testvar1","value":"abc"},{"key":"testvar2", "value": "abc-de"}]
首先我想拆分这个字符串,所以我使用IFS="," read -d -r -a rows < vars.txt
但在“值”字段包含连字符时停止:
echo ${rows[*]}得到[{"key":"testvar1" "value":"abc"} {"key":"testvar2" "value": "abc
我该如何解决这个问题,以便使用完整的abc-de?

vaqhlq81

vaqhlq811#

简短说明

read -d需要一个参数,该参数的第一个字符是记录分隔符--读取记录的字符将被认为是完整的。它将-r作为该参数,因此将-r中的-视为停止阅读的字符。
只要不使用-d参数,除非您知道为什么要使用它。

阅读输入,直到EOF或NUL字节

如果您的意图是告诉read继续运行,直到EOF或NUL,那么将''作为-d后面的参数传递;因此:

IFS=, read -d '' -r -a rows <vars.txt

但是要注意,除非vars.txt以文本NUL字符结尾,否则它将以非零状态退出。

41ik7eoe

41ik7eoe2#

这不是read的工作,使用jq之类的JSON解析器来提取值,使用readarray来填充shell数组。

$ readarray -t rows < <(jq -r '.[].value' vars.txt)
$ declare -p rows
declare -a rows=([0]="abc" [1]="abc-de")

(假设你使用的是bash的半现代版本,如果你使用的是macOS自带的化石版本,请安装最新版本,并首选使用该版本。

相关问题