Score:7

ทุบตีตัวแปรใน 2 เครื่องหมายคำพูด

ธง pl

ฉันต้องการส่งคำขอเช่นนี้กับ ขด:

ขดพารามิเตอร์และส่วนหัว --data-binary '{"secret":"$1"}'

แต่ $1 ไม่เป็นตัวแปร ฉันลองใช้ เสียงสะท้อน ด้วยคำสั่งนี้:

echo '{"asd":"$1"}' dhkdgb

และฉันได้ผลลัพธ์นี้:

{"asd":"$1"} dhkdgb

อย่างไรก็ตาม ฉันต้องการรับผลลัพธ์นี้:

{"asd":"dhkdgb"}

และที่ ขด คำขอ ฉันต้องการส่งสิ่งนี้:

ขดพารามิเตอร์และส่วนหัว --data-binary '{"secret":"argv 0 of script"}'

ฉันจะแก้ปัญหานี้ได้อย่างไร?

ar flag
$1 เป็นตัวแปรที่มีอาร์กิวเมนต์แรกของสคริปต์ของคุณ... แต่คุณไม่ได้ใช้สคริปต์ใช่ไหม คุณเพียงแค่พิมพ์คำสั่ง curl ที่พรอมต์? ดังนั้น $1 จึงว่างเปล่า/ไม่ได้ตั้งค่า นอกจากนี้ ตัวแปรภายในเครื่องหมายคำพูดเดี่ยวจะไม่ถูกตีความ คุณจะใช้เครื่องหมายคำพูดเดี่ยวหากคุณต้องการใช้ "$1" ตามตัวอักษร โดยไม่ให้ Bash ตีความว่าเป็นตัวแปร
ar flag
หากคุณเรียกใช้สิ่งนี้จากสคริปต์ และ `$1` ถูกกำหนดไว้แล้วจริงๆ ให้แทนที่เครื่องหมายคำพูดเดี่ยวของคุณด้วยเครื่องหมายคำพูดคู่ และเครื่องหมายคำพูดคู่ของคุณด้วยเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่ที่เป็น Escape แทนที่ `'{"secret":"$1"}'` ด้วย `"{\"secret\":\"$1\"}"` หรือด้วย `"{'secret':'$1'}"`
in flag
@mivk ข้อมูลจำเพาะ JSON อย่างเป็นทางการจริง ๆ แล้วต้องใช้เครื่องหมายอัญประกาศคู่สำหรับสตริง (ทั้งในคีย์และค่า) ดังนั้นเพื่อให้พกพาได้อย่างเหมาะสม คุณจะต้องใช้เครื่องหมายอัญประกาศคู่แบบ Escape แทนวิธีอัญประกาศเดี่ยว
Score:11
ธง hr

มีหลายวิธีที่จะทำเช่น ที่ให้ไว้

$ set -- 'ฟูบาร์'

(เพื่อกำหนดค่า ฟูบาร์ ไปยังพารามิเตอร์ตำแหน่งแรกของเชลล์ เหมือนกับในสคริปต์ที่เรียกใช้ เช่น มายสคริปต์ "foo bar") ตัวอย่างเช่น

$ echo '{"asd:":"'"$1"'"}'
{"asd:":"ฟูบาร์"}

หรือ

$ echo {\"asd:\":\""$1"\"}
{"asd:":"ฟูบาร์"}

อย่างไรก็ตาม คุณอาจพบว่าการใช้เปลือกหอยนั้นสะอาดกว่า พิมพ์ฉ ในตัวเพื่อสร้างสตริงที่จัดรูปแบบซึ่งคุณสามารถกำหนดให้กับตัวแปรใหม่:

$printf -v data '{"asd": "%s"}' "$1"
$ echo "ข้อมูล $"
{"asd": "ฟูบาร์"}

ซึ่งคุณสามารถใช้เป็น

ขดพารามิเตอร์และส่วนหัวบางอย่าง --data-binary "$data"

อีกทางหนึ่ง เนื่องจากดูเหมือนว่าคุณกำลังพยายามส่งออบเจกต์ JSON ไปยังคำสั่ง curl คุณจึงควรพิจารณาใช้ เจคิว แทนที่ พิมพ์ฉ:

$ jq -nc --arg x "$1" '{asd: $x}'
{"asd":"foo bar"}

หรือในทำนองเดียวกันโดยใช้ในตัว $ARGS อาร์เรย์

$ jq -nc --arg asd "$1" '$ARGS.named'
{"asd":"foo bar"}

หากคุณต้องการส่งทั้งชื่อและค่าไปยังตัวสร้าง

muru avatar
us flag
`jq` มีวิธีที่ดีกว่าในการทำเช่นนี้: `jq -n --arg asd "$1" '.$ARGS.named'`
vanadium avatar
cn flag
ฉันคิดว่าวิธีแก้ปัญหานี้ง่ายกว่ามาก - ดูคำตอบของฉัน
hr flag
@vanadium - แน่นอนว่าอย่างที่ฉันพูดถึงมีหลายวิธีที่จะทำกับ esacpes ฉันแค่ไม่ชอบ "ไม้จิ้มฟันแบบเอน" เลยพยายามเสนอทางเลือกอื่น
hr flag
@muru ที่ดี - ขอบคุณ เพิ่ม
Score:0
ธง in

ฉันมักจะใช้ นี่เอกสาร และ -d@- (อ่านข้อมูลอินพุตจาก stdin) สำหรับเขียนเนื้อหาคำขอ JSON:

แมว <<EOF |
{
    "ความลับ": "$ความลับ"
}
อฟ
ขด ... \
    -X โพสต์ \
    -H "ประเภทเนื้อหา: แอปพลิเคชัน/json" \
    "${BASE_URL%%/}/the/path" -d@-

ใช่ ไวยากรณ์ค่อนข้างแปลก

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา