Dấu cách trong các phép gán biến trong tập lệnh shell


17

Sự khác biệt giữa các bài tập biến dưới đây là gì?

var=23
var =23
var= 23
var = 23

Có sự khác biệt nào trong không gian xung quanh toán tử gán không?


Trong hầu hết các ngôn ngữ lập trình, điều này sẽ không có sự khác biệt nào cả ... Có thực sự có sự khác biệt để bắt đầu không? Ngoài ra bạn đang nói chuyện oldschool ở đây? không tro / zsh / bash hoặc những thứ mới khác?
Cestarian

Chỉ các ví dụ đầu tiên thiết lập một biến.
DisplayName

Sau đó, 3 người cuối cùng không ném lỗi cú pháp? hoặc họ thực sự giữ ý nghĩa?
Cestarian

2
@Cestarian họ có thể có nghĩa là một cái gì đó, nếu bạn có một lệnh được gọi varthì var =23sẽ được truyền =23cho var, và var = 23sẽ truyền =23tới var. Hoặc, nếu bạn có một lệnh được gọi var=thì var= 23sẽ chuyển 23sang lệnh var=.
DisplayName

1
@Cestarian Thay thế bởi bash, trong đó thực hiện chính xác điều tương tự như shtrong cả bốn trường hợp.
pfnuesel

Câu trả lời:


14

Điều đó phụ thuộc rất nhiều vào vỏ. Nếu chúng ta chỉ nhìn vào 4 họ vỏ chính (Bourne, csh, rc, fish):

Gia đình Bourne

Đó là vỏ Bourne và tất cả các biến thể của nó và ksh, bash, ash/ dash, zsh, yash.

  • var=23: đó là cú pháp gán biến chính xác: một từ bao gồm các chữ cái, chữ số hoặc dấu gạch dưới được theo sau bởi một ký tự không được trích dẫn =xuất hiện trước một đối số lệnh (ở đây là chính nó)
  • var =23, varlệnh với tham =23số (ngoại trừ trường zshhợp =somethinglà toán tử đặc biệt mở rộng đường dẫn của somethinglệnh. Ở đây, bạn có thể gặp lỗi vì 23không chắc là tên lệnh hợp lệ).
  • var= 23: một nhiệm vụ var=theo sau bởi một tên lệnh 23. Điều đó có nghĩa là thực thi 23với var=truyền vào môi trường của nó ( varbiến môi trường có giá trị trống).
  • var = 23, varlệnh với =23như là đối số. Hãy thử với echo = 23ví dụ.

Gia đình Csh

cshtcsh. Các phép gán biến có với set var = valuecú pháp cho các biến vô hướng, set var = (a b)cho các mảng, setenv var valuecho các biến môi trường, @ var=1+1để gán và đánh giá số học.

Vì thế:

  • var=23chỉ đang gọi var=23lệnh.
  • var =23đang gọi varlệnh với =23làm đối số.
  • var= 23đang gọi var=lệnh với 23tư cách là đối số
  • var = 23đang gọi varlệnh với =23như là đối số.

Gia đình Rc

Đó là rc, esakanga. Trong các shell đó, các biến là các mảng và phép gán với var = (foo bar), với var = fooviết tắt là var = (foo)(một mảng có một foophần tử) và var =viết tắt cho var = ()(mảng không có phần tử, sử dụng var = ''cho một mảng có một phần tử trống).

Trong mọi trường hợp, khoảng trống (khoảng trắng hoặc tab) xung quanh =được cho phép và tùy chọn. Vì vậy, trong các shell đó, 4 lệnh đó tương đương và tương đương với var = (23)việc gán một mảng với một phần tử 23.

Trong fish, cú pháp gán biến là set var value1 value2. Giống như trong rc, các biến là mảng.

Vì vậy, hành vi sẽ giống như với csh, ngoại trừ việc fishsẽ không cho phép bạn chạy một lệnh với =tên của nó. Nếu bạn có một lệnh như vậy, bạn cần phải gọi nó qua shví dụ : sh -c 'exec weird===cmd'.

Vì vậy, tất cả var=23var= 23sẽ cung cấp cho bạn một lỗi, var =23sẽ gọi varlệnh với =23tư cách là đối số và var = 23sẽ gọi varlệnh với =23dưới dạng đối số.


8

var=23gán 23 cho biến var.

var =23cố gắng chạy lệnh (hoặc bí danh hoặc hàm) varvới đối số=23

var = 23ditto, nhưng tranh luận =23

var= 23đặt varbiến môi trường thành chuỗi trống, sau đó chạy lệnh23

Vâng, shell là lạ như một ngôn ngữ lập trình. Nhưng nó có ý nghĩa hoàn hảo như một cái vỏ để sử dụng tương tác, trong đó các không gian tách biệt các lệnh và đối số. Hầu hết các "ký tự đặc biệt" ( =trong trường hợp này) chỉ có ý nghĩa đặc biệt ở các vị trí cụ thể, để cho phép các đối số gần như tùy ý đối với các lệnh. Xem các diễn giải ở trên.


3
  • var=23 là cú pháp đúng để gán giá trị cho một biến.
  • var =23được coi là lệnh varvới =23tùy chọn / đối số cho lệnh var(Mặc dù cú pháp đúng / chuẩn cho đối số / tùy chọn là -optionhoặc --option)
  • var= 23sẽ không gán gì cho varkhông gian trắng phá vỡ quá trình gán và 23sẽ được coi là một lệnh khác. Cách giải quyết là var=\ 23hoặc var=' 23'để lưu trữ khoảng trắng.
  • var = 23có tác dụng tương tự như đã thảo luận trong trường hợp thứ 2 .

    Trên thực tế, loại sử dụng không gian xung quanh =này thường được sử dụng trong điều kiện thử nghiệm bên trong [[ ]]. Ví dụ cho Bash:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

Và sau tất cả hành vi của khoảng trắng xung quanh =phụ thuộc vào vỏ của bạn và ngôn ngữ lập trình.

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.