Cách đưa ký tự '&' vào câu lệnh bash curl


98

Tôi đang cố gắng sử dụng curl in bash để tải xuống một trang web, nhưng & biểu tượng trong URL không được hiểu là một ký tự như tôi muốn. Bất kỳ ý tưởng nào về cách tôi có thể thuyết phục bash rằng biểu tượng &chỉ là một ký tự nhàm chán và không có gì đặc biệt?


Hãy xem chủ đề sau đây, điều này sẽ giúp bạn - stackoverflow.com/questions/2067969/…
morgents

Tôi đã cố gắng thay thế các &biểu tượng với \&, '&', "&", ^&nhưng đã không thể để có được URL để đánh giá một cách chính xác. Trên thực tế, các '&'hoạt động khi tôi chạy lệnh curl từ Terminal.app, nhưng không thành công khi tôi đặt nó trong một tập lệnh bash, quấn nó trong một vòng lặp và chạy nó.
Chernoff

Câu trả lời:


122

Đặt toàn bộ URL bên trong dấu ngoặc kép sẽ giải quyết được vấn đề của bạn.


9
các dấu ngoặc kép có thể tốt hơn, trừ khi cần phải giải quyết các biến.
jpm

Khi tôi sử dụng dấu ngoặc kép xung quanh toàn bộ URL, biểu thức ${i}không trả về giá trị.
Chernoff

2
Trong trường hợp của tôi, dấu nháy kép không thành công trong khi dấu nháy đơn hoạt động tốt.
abeboparebop

3
Vui lòng sử dụng cẩn thận chương trình nào được sử dụng để nhập dấu ngoặc kép. Trong khi vội vàng để chỉnh sửa một kịch bản shell, tôi đã sử dụng một chương trình chỉnh sửa văn bản. Nó đặt dấu ngoặc kép thay vì dấu ngoặc kép thẳng. Điều này thực sự làm rối kịch bản và làm cho vấn đề khó tìm ra!
David

40
curl "http://www.example.com?m=method&args=1"

Bạn có đang sử dụng & làm dấu phân cách cho URL GET không? Hay nằm trong một phần dữ liệu?

Nếu nó nằm trong dữ liệu, bạn phải mã hóa nó thành một ký tự HTML, nếu không, hãy đặt dấu ngoặc kép.

Mã hóa cho &phải có %26trong URL.

curl "http://www.example.com?m=this%26that

Tôi đang sử dụng &biểu tượng như một phần dữ liệu, gần như chính xác như bạn đã trình bày. Điều bắt buộc là, thay vì các giá trị số tôi đang sử dụng ${i}. Vì vậy, tôi muốn http://www.example.com?m=method&args=${i}đánh giá dưới dạng một URL.
Chernoff

3
Cách tôi vừa hiển thị URL sử dụng '&' làm đại lượng cho các biến GET, vì vậy bây giờ tôi bối rối, trong $ [i] bạn có một phần dữ liệu chứa '&'? Nếu đó là trường hợp, bạn sẽ cần phải mã hóa URL. & =% 26
Matt Clark

1
Tìm khắp mạng cũng không tìm ra lời giải. @MattClark bạn là anh hùng. Tôi chỉ mã hóa url & đó là một phần dữ liệu và tập lệnh của tôi đang hoạt động tốt.
Haris ur Rehman

1
Có mất tích "ở phần cuối của đoạn mã thứ hai?
David

23

Đặt dấu ngoặc kép xung quanh &biểu tượng có vẻ hiệu quả. Đó là, sử dụng một URL như http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}với curl sẽ trả về trang web được yêu cầu.


2
bạn nên đưa yêu cầu lập luận vào câu hỏi để nó rõ ràng cho các quan điểm sau này.
Manatax

Tại sao câu trả lời này được sử dụng? Câu trả lời này phải được điền vào stackoverflow.com/a/13339492/2898694
Sharikov Vladislav

13

Thay vì thử các ký tự thoát "&", bạn có thể chỉ định tham số url http trong yêu cầu POST với tham số -d như được hiển thị bên dưới:

curl -X POST http://www.example.com \
-d arg1=this \
-d arg2=that

Nếu yêu cầu là GET, thì bạn cũng nên thêm tùy chọn -G, tùy chọn này yêu cầu curl gửi dữ liệu với yêu cầu GET.

curl -X GET -G http://www.example.com \
-d arg1=this \
-d arg2=that

Đây là câu trả lời tốt nhất! Cám ơn!
unbreak

Điều này đã làm việc cho tôi. Thêm dấu ngoặc kép không hoạt động.
Juhog,

9

Bạn có thể sử dụng %26thay thế &. Mã thực thể sẽ hoạt động tốt.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.