วิธีรวมตัวแปรสภาพแวดล้อมใน Bash line CURL


39

พยายามรับส่งข้อมูลเพื่อแจ้งเตือนเมื่อการดาวน์โหลดเสร็จสิ้น

งานนี้:

curl -u <my-api-token>: \
  -X POST https://api.pushbullet.com/v2/pushes \
  --header 'Content-Type: application/json' \
  --data-binary '{"type": "note", "title": "$TR_TORRENT_NAME", \
  "body": "$TR_TORRENT_NAME completed."}'

... ยกเว้นว่าจะมีการพุช$TR_TORRENT_NAMEและไม่ใช่เนื้อหาจริงของตัวแปรนั้น

ฉันจำเป็นต้องหลบหนีบางคำพูดหรืออะไร?

คำตอบ:


58

ภายในเครื่องหมายคำพูดเดี่ยวเชลล์จะไม่ขยายสิ่งใด วางไว้ในเครื่องหมายคำพูดคู่แทน:

curl -u <my-api-token>: \
  -X POST https://api.pushbullet.com/v2/pushes \
  --header 'Content-Type: application/json' \
  --data-binary '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", \
  "body": "'"$TR_TORRENT_NAME completed"'."}'

ตรวจสอบวิธีการทำงานโดยดูที่:

$ TR_TORRENT_NAME=MyTorrent
$ echo '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", "body": "'"$TR_TORRENT_NAME completed"'."}'
{"type": "note", "title": "MyTorrent", "body": "MyTorrent completed."}

เมื่อตัวแปรเชลล์ปรากฏขึ้นมันจะอยู่ในเครื่องหมายคำพูดคู่เสมอ ดังนั้นจึงขยายอย่างเหมาะสม

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

 "'"$TR_TORRENT_NAME"'"

ทำให้ตัวละครแต่ละตัวในทางกลับกัน:

  1. "เป็นอักขระเครื่องหมายคำพูดสองตัวที่อยู่ภายในสตริงที่ยกมาเดี่ยว (เพื่อความกะทัดรัดจุดเริ่มต้นของสตริงนี้จะไม่แสดงในส่วนนี้)

  2. ' ปิดสตริงที่มีเครื่องหมายคำพูดเดี่ยว

  3. " เปิดสตริงที่มีเครื่องหมายคำพูดคู่

  4. $TR_TORRENT_NAME เป็นตัวแปรเชลล์ที่ขยายภายในเครื่องหมายคำพูดคู่

  5. " ปิดสตริงที่มีเครื่องหมายคำพูดคู่

  6. ' เปิดสตริงที่อ้างถึงเดี่ยวใหม่

  7. " วางอักขระเครื่องหมายคำพูดคู่ภายในสตริงที่มีเครื่องหมายคำพูดเดี่ยว


คุณต้องการขั้นตอนที่ 3 และ 5 หรือไม่?
davidfrancis

@davidfrancis หากข้ามขั้นตอนที่ 3 และ 5 ไปแล้วขั้นตอนที่ 4 จะขึ้นอยู่กับการแยกคำและการขยายชื่อพา ธและอาจทำให้เกิดปัญหาทั้งหมดได้ หากไม่มีใครต้องการแยกคำและขยายชื่อพา ธอย่างชัดเจนตัวแปรเชลล์ควรอยู่ในเครื่องหมายคำพูดคู่เสมอ
John1024

ขอบคุณสำหรับสิ่งนั้นคุณช่วยยกตัวอย่างหน่อยได้ไหม? มันทำงานในตัวอย่างของฉันเองซึ่งเป็นสาเหตุที่ฉันถาม แต่ไม่มีช่องว่างหรือสิ่งอื่นใดที่ซับซ้อนในนั้น
davidfrancis

@davidfrancis ลองTR_TORRENT_NAME="A * B"ดูว่าเกิดอะไรขึ้น
John1024

1

หากต้องการรวมตัวแปรสภาพแวดล้อมใน bash line curl โดยไม่ต้องใส่เครื่องหมายคำพูดล้อมรอบเนื้อหาตัวแปรสิ่งนี้ได้ผลสำหรับฉัน:

--header 'PRIVATE-TOKEN: '"$PRIVATE_TOKEN"''

หรือใช้ภาพจำลองที่ได้รับการอธิบายครั้งแรกโดยไม่มีเครื่องหมายคำพูดรอบ ๆ ช่องเนื้อหา:

curl -u <my-api-token>: \
  -X POST https://api.pushbullet.com/v2/pushes \
  --header 'Content-Type: application/json' \
  --data-binary '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", \
  "body": '"$TR_TORRENT_NAME completed"'.}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.