ฉันชอบคำแนะนำ @Michel จริงๆ บางครั้งคุณอาจแยกค่าตัวแปรบางอย่างเพื่อดำเนินงานในเซิร์ฟเวอร์นั้นโดยใช้ BASH ดังนั้นตัวแปรที่ต้องการรู้ การใช้วิธีการนี้เป็นวิธีการหลีกเลี่ยงหรือการเรียก jq หลายครั้งเพื่อตั้งค่าต่อตัวแปรหรือแม้กระทั่งการใช้คำสั่งการอ่านที่มีตัวแปรหลายตัวซึ่งบางตัวสามารถใช้ได้และว่างเปล่าซึ่งนำไปสู่การเปลี่ยนค่า (นั่นคือปัญหาของฉัน)
วิธีก่อนหน้าของฉันที่นำไปสู่จะนำไปสู่ข้อผิดพลาดในการเปลี่ยนค่าหาก. svID [] .ID = "" ( svจะได้รับค่าslotID
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
หากคุณดาวน์โหลดวัตถุโดยใช้ curl ต่อไปนี้เป็นวิธีของฉันในการเปลี่ยนชื่อตัวแปรเป็นชื่อที่เรียกง่าย ๆ ว่าดึงข้อมูลจาก data arrays
การใช้ eval และตัวกรองจะแก้ปัญหาด้วยหนึ่งบรรทัดและจะสร้างตัวแปรที่มีชื่อที่ต้องการ
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] | เป็นเรื่องธรรมดามากหากมีแหล่งที่มาหากจากเซิร์ฟเวอร์ RESTFULL API โดยใช้ GET ข้อมูลการตอบกลับจะเป็น:
[{"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
ทำงานอื่น ๆได้เหมือนต้นฉบับโดยไม่ต้องใช้อาร์เรย์ มันยังคงปลอดภัยกว่า eval แม้ว่าการเปลี่ยนแปลงPATH
หรือบางสิ่งบางอย่างยังเป็นไปได้น้อยกว่ารุ่นนี้