Điểm:7

Biến Bash trong 2 dấu ngoặc kép

lá cờ pl

Tôi muốn gửi một yêu cầu như thế này với Xoăn:

cuộn tròn một số tham số và tiêu đề --data-binary '{"secret":"$1"}'

nhưng $1 không phải là biến. tôi đã thử sử dụng tiếng vang với lệnh này:

tiếng vang '{"asd":"$1"}' dhkdgb

và tôi nhận được kết quả này:

{"asd":"$1"} dhkdgb

Tuy nhiên, tôi muốn có được đầu ra này:

{"asd":"dhkdgb"}

Và tại Xoăn yêu cầu, tôi muốn gửi cái này:

cuộn tròn một số tham số và tiêu đề --data-binary '{"secret":"argv 0 of script"}'

Làm thế nào tôi có thể giải quyết vấn đề này?

lá cờ ar
$1 là một biến chứa đối số đầu tiên cho tập lệnh của bạn... nhưng bạn không sử dụng tập lệnh, phải không? Bạn chỉ cần gõ lệnh curl tại dấu nhắc? Vì vậy, $1 trống/không được đặt. Ngoài ra, các biến bên trong dấu ngoặc đơn không được giải thích. Bạn sẽ sử dụng dấu ngoặc đơn nếu bạn muốn sử dụng "$1" theo nghĩa đen mà không cần Bash diễn giải nó dưới dạng biến.
lá cờ ar
Nếu bạn gọi điều này từ một tập lệnh và `$1` thực sự được xác định, thì hãy thay thế dấu nháy đơn của bạn bằng dấu nháy kép và dấu nháy kép của bạn bằng dấu nháy đơn hoặc dấu nháy kép thoát. Thay thế `'{"secret":"$1"}'` bằng `"{\"secret\":\"$1\"}"` hoặc bằng `"{'secret':'$1'}"`
lá cờ in
@mivk Thông số JSON chính thức thực sự yêu cầu dấu ngoặc kép cho chuỗi (cả về khóa và giá trị), do đó, để nó có thể di động đúng cách, bạn sẽ phải sử dụng dấu ngoặc kép thoát thay vì cách tiếp cận trích dẫn đơn.
Điểm:11
lá cờ hr

Có một số cách để làm điều đó ex. được cho

$ bộ -- 'thanh foo'

(gán giá trị thanh foo đến tham số vị trí đầu tiên của trình bao, như thể trong một tập lệnh được gọi như myscript "foo bar") thì chẳng hạn

$ echo '{"asd:":"'"$1"'"}'
{"asd:":"foo bar"}

hoặc

$ echo {\"asd:\":\""$1"\"}
{"asd:":"foo bar"}

Tuy nhiên, bạn có thể thấy sạch hơn khi sử dụng trình bao bản inf dựng sẵn để tạo một chuỗi được định dạng mà bạn có thể gán cho một biến mới:

$ printf -v data '{"asd": "%s"}' "$1"
$ tiếng vang "$dữ liệu"
{"asd": "foo bar"}

mà sau đó bạn có thể sử dụng như

cuộn tròn một số tham số và tiêu đề --data-binary "$data"

Ngoài ra, vì có vẻ như bạn đang cố chuyển một đối tượng JSON tới lệnh curl, nên bạn có thể cân nhắc sử dụng jq thay cho bản inf:

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

hoặc tương tự bằng cách sử dụng tích hợp $ARGS mảng

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

nếu bạn muốn chuyển cả tên và giá trị cho hàm tạo.

muru avatar
lá cờ us
`jq` có một cách hay hơn để thực hiện việc này: `jq -n --arg asd "$1" '.$ARGS.named'`
vanadium avatar
lá cờ cn
Trừ khi tôi bỏ lỡ điều gì đó, tôi nghĩ điều này dễ giải quyết hơn nhiều - hãy xem câu trả lời của tôi.
lá cờ hr
@vanadium - chắc chắn rồi, như tôi đã đề cập, có một số cách để làm điều đó với esacpes. Tôi chỉ tình cờ không phải là người hâm mộ "tăm xỉa răng" nên đã cố gắng đưa ra một số lựa chọn thay thế
lá cờ hr
@muru thật tuyệt - cảm ơn. Thêm.
Điểm:0
lá cờ in

Tôi có xu hướng sử dụng một tài liệu di truyền-d@- (đọc dữ liệu đầu vào từ stdin) để soạn nội dung yêu cầu JSON:

con mèo <<EOF |
{
    "bí mật": "$BÍ MẬT"
}
EOF
Xoăn ... \
    -X ĐĂNG \
    -H "Loại nội dung: ứng dụng/json" \
    "${BASE_URL%%/}/the/path" -d@-

Vâng, cú pháp là một chút kỳ lạ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.