Trích dẫn một biến trong shell script


9

ví dụ

if [ "$FOO" = "true" ]; then

đấu với

if [ $FOO = "true" ]; then

Sự khác biệt là gì? Có vẻ cả hai tuyên bố cũng hoạt động.


Trong Bash, sử dụng dấu ngoặc vuông đôi và bạn không cần dấu ngoặc kép và bạn sẽ nhận được lợi ích bổ sung .
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson Không hoàn toàn, bạn không cần dấu ngoặc kép ở phía bên phải của các toán tử khớp mẫu và bằng (trong).
Gilles 'SO- ngừng trở nên xấu xa'


@Gilles: Đôi khi không. Đối với các chuỗi ký tự chứa khoảng trắng hoặc cho các chuỗi ký tự hoặc các biến có chứa các ký tự toàn cục mà bạn muốn được lấy theo nghĩa đen , phía bên phải phải được trích dẫn : a='foo bar'; [[ $a == "foo bar" ]]. Tuy nhiên, một biến không chứa ký tự toàn cầu không cần phải là : [[ $a == $a ]]. Mở rộng từ không được thực hiện trong dấu ngoặc vuông. Và cho phù hợp regex, các mô hình trên phía bên tay phải không được trích dẫn hoặc nó sẽ được thực hiện như chuỗi chữ: [[ $a =~ .*oo.*r ]](mô hình phải ở trong một biến un-trích dẫn, tuy nhiên, thay vì ...
. Bị tạm dừng cho đến khi có thông báo mới

được kết hợp theo nghĩa đen như ở đây). Để khớp mẫu theo kiểu toàn cầu, các ký tự toàn cục không được trích dẫn, cho dù bằng chữ hoặc theo biến : [[ $a == foo* ]]. Bạn có thể cung cấp bất kỳ ví dụ bổ sung nào về yêu cầu trích dẫn bên cạnh ví dụ chuỗi bằng chữ của tôi không?
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


6

Nếu giá trị của $FOOlà một từ không chứa ký tự đại diện \[*?, thì hai từ này giống hệt nhau.

Nếu $FOOkhông được gán, hoặc trống, hoặc nhiều hơn một từ (nghĩa là chứa khoảng trắng hoặc $IFS), thì phiên bản không trích dẫn là lỗi cú pháp. Nếu nó chỉ là một chuỗi từ đúng (chẳng hạn như 0 -eq 0 -o false), kết quả có thể là tùy ý. Do đó, cách tốt nhất là luôn trích dẫn các biến trong shell script.

Ngẫu nhiên, "true"không cần phải trích dẫn.


3

Để minh họa những vấn đề nó có thể gây ra, đây là một vài ví dụ.

Giả sử chúng ta có hai biến như sau:

FOO="some value"
BAR="some value"

Bây giờ chúng ta có hai biến giữ chính xác cùng một chuỗi / giá trị. Nếu chúng tôi đã thực hiện một số câu lệnh if để kiểm tra kết quả, trong trường hợp của bạn:

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

Tại thời điểm này, bạn sẽ nhận được bash: [: too many arguments. $ FOO không được trích dẫn hiện giữ ba giá trị, cụ thể là '[ , some , value'. [từ khóa kiểm tra không biết phải thực thi cái gì vì nó đang mong đợi đối số thứ nhất hoặc thứ hai là toán tử.

Khi chúng tôi trích dẫn "$ FOO", chúng tôi nói rõ ràng ifđể xem xét các giá trị phù hợp trong đó không có sự phân tách từ nào diễn ra.

Một vi dụ khac:

my_file="A random file.txt"
  • làm rm $my_filecó nghĩa là loại bỏ 'A' 'ngẫu nhiên' 'file.txt', làm cho nó thành ba tệp.
  • làm rm "$my_file"sẽ loại bỏ "Một file.txt ngẫu nhiên" tạo ra một tệp.

Hy vọng tôi đã không nhầm lẫn bạn với những ví dụ này.


0

Trong trường hợp cụ thể này không có sự khác biệt.

Tuy nhiên, nếu $FOOchứa một khoảng trắng hoặc một số ký tự đặc biệt, bạn sẽ gặp vấn đề.

Trong "$FOO"trường hợp, nó sẽ sử dụng tổng biến, để làm cho trận đấu cách ly bạn khỏi vấn đề không gian.

Tuy nhiên, nếu bạn sử dụng $FOOvà có trường hợp đặc biệt, nó sẽ ảnh hưởng đến câu lệnh if.

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.