Đối số dòng lệnh có thể được giải thích bởi vỏ lệnh của hệ thống, thay đổi hành vi của lệnh hoặc thay đổi giá trị của các đối số trước khi chúng được chuyển vào chương trình được gọi.
Khi một đối số (chẳng hạn như giá trị cho --password
) chứa một ký tự mà shell có thể diễn giải, chúng cần được trích dẫn (thường được đặt trong các trích dẫn đơn '
trong dấu ngoặc kép hoặc dấu ngoặc kép "
trong Windows) hoặc thoát riêng lẻ (thường có dấu gạch chéo ngược \
trước mỗi metacharacter ) để tránh giải thích bằng vỏ.
Mặc dù các ký tự cụ thể là dành riêng cho hệ thống, một số ký tự cần chú ý bao gồm:
$ & ! \ [ ] < > `
Nếu mật khẩu, ví dụ thực sự xấu, được đặt thành pa$$word
...
mysql --password=pa$$word # does not work
mysql --password='pa$$word' # works
mysql --password=pa\$\$word # works, but slightly unclear what's going on at first glance
Đọc thêm:
Cập nhật: để thoát dấu ngoặc '
đơn hoặc "
dấu ngoặc kép trong mật khẩu, bạn có thể thoát chúng bằng dấu gạch chéo ngược hàng đầu hoặc gửi toàn bộ đối số theo kiểu trích dẫn ngược lại nếu không có ký tự nào khác mà kiểu trích dẫn được chọn không tương thích với.
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
Nếu bạn cũng có một trích dẫn và các ký tự đặc biệt khác, bạn sẽ bị mắc kẹt với dấu gạch chéo ngược vì trong unix, trích dẫn kép "yếu" hơn một trích dẫn và nhiều ký tự đại diện vẫn được mở rộng khi được đặt trong dấu ngoặc kép nhưng không đơn lẻ trích dẫn.
Đây không phải là đặc thù của MySQL nhưng áp dụng cho mọi thứ có đối số dòng lệnh.
Thông thường bạn có thể sử dụng echo
lệnh để xem shell đang diễn giải các đối số của bạn như thế nào.
$ echo foo$bar
foo # literal 'foo' plus the (empty) shell variable $bar
$ echo foo\$bar
foo$bar # backslash prevents expansion of $bar as a variable
$ echo "foo$$bar" # weaker double quote doesn't prevent expansion so
foo9691bar # the $$ expands to the unix process id (pid) of the current shell
$ echo 'foo$$bar'
foo$$bar # "stronger" single quote prevents shell expansion
$ echo "foo'bar"
foo'bar # double quote allows single quote within the literal
Theo dõi: Shell bash (và có lẽ là một số người khác) cho phép thoát các dấu ngoặc đơn trong các chuỗi trích dẫn đơn, mặc dù quy ước này rất kỳ quái (có thể dựa trên một số quyết định đã bị lãng quên từ lâu đối với thời gian)
Thay thế từng '
bên trong chuỗi bằng '\''
trước khi gói toàn bộ chuỗi trong dấu ngoặc đơn ... vì vậy chuỗi ký tự foo'bar
được thể hiện dưới dạng 'foo'\''bar'
.
Như tôi đã nói, kỳ quái. Điều này là cần thiết bởi vì dấu gạch chéo ngược thoát khỏi một trích dẫn bên ngoài một chuỗi được trích dẫn, dấu gạch chéo ngược không thoát khỏi bên trong một chuỗi trích dẫn trong bash và các chuỗi trích dẫn đơn có thể được đóng và mở lại bằng nhiều dấu ngoặc đơn miễn là không có dấu ngoặc kép nhân vật can thiệp có ý nghĩa đặc biệt. Vì vậy, '\''
đóng trích dẫn của chuỗi, sau đó cung cấp các chữ đã thoát, sau đó mở lại trích dẫn của chuỗi.