Tôi thực sự thích đề xuất @Michel. Đôi khi, bạn thực sự có thể chỉ trích xuất một số giá trị biến để thực thi một tác vụ trong máy chủ cụ thể đó bằng BASH. Vì vậy, các biến mong muốn được biết. Cách sử dụng phương pháp này là cách để tránh hoặc nhiều cuộc gọi đến jq để đặt giá trị cho mỗi biến hoặc thậm chí sử dụng câu lệnh đọc với nhiều biến trong đó một số có thể hợp lệ và trống, dẫn đến thay đổi giá trị (đó là vấn đề của tôi)
Cách tiếp cận trước đó của tôi dẫn đến lỗi dịch chuyển giá trị nếu .svID [] .ID = "" ( sv sẽ nhận được giá trị slotID
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
Nếu bạn đã tải xuống đối tượng bằng curl, đây là cách tiếp cận của tôi để đổi tên một số biến thành tên thân thiện dưới dạng trích xuất dữ liệu từ mảng dữ liệu
sử dụng eval và bộ lọc sẽ giải quyết vấn đề với một dòng và sẽ tạo ra các biến có tên mong muốn
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 )"
Ưu điểm trong trường hợp này là thực tế là nó sẽ lọc, đổi tên, định dạng tất cả các biến mong muốn trong bước đầu tiên. Quan sát rằng trong đó có. [0] | đó là điều rất phổ biến nếu có nguồn nếu từ máy chủ API RESTFULL sử dụng GET, dữ liệu phản hồi là:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Nếu dữ liệu của bạn không phải từ một mảng, tức là. là một đối tượng như:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
chỉ cần xóa chỉ mục ban đầu:
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 )"
Đây là một câu hỏi cũ, nhưng tôi cảm thấy chia sẻ, vì nó rất khó tìm
declare -- “$key=$value”
và có$AUTHOR
vv hoạt động như trong bản gốc, không có mảng. Nó vẫn an toàn hơn eval, mặc dù thay đổiPATH
hoặc một cái gì đó vẫn có thể ít hơn so với phiên bản này.