$ {Param: = value} nghĩa là gì?


34

Tôi đọc phần sau trong Hướng dẫn sử dụng cho Z-Shell :

Từ đồng nghĩa với 'true' là ':'; nó thường được sử dụng trong hình thức này để đưa ra các đối số có tác dụng phụ nhưng không nên sử dụng - đại loại như

: ${param:=value}

đó là một thành ngữ phổ biến trong tất cả các dẫn xuất vỏ Bourne. Trong phần mở rộng tham số, $paramđược đưa ra giá trị giá trị nếu nó trống trước đó và để lại một mình. Vì đó là lý do duy nhất cho việc mở rộng tham số, bạn sử dụng :để bỏ qua đối số. Trên thực tế, shell hoàn toàn xây dựng dòng lệnh - dấu hai chấm, theo sau là giá trị của $paramnó là gì, cho dù việc chuyển nhượng có xảy ra hay không - sau đó thực thi lệnh; nó chỉ xảy ra rằng ':' không có thông báo về các đối số mà nó đã được đưa ra.

nhưng tôi không hiểu nó Tôi hiểu điều đó :có nghĩa true, nhưng có hai dấu hai chấm trong biểu thức. Như một câu hỏi nhỏ, tại sao thành ngữ này được sử dụng rất nhiều trong tất cả các dẫn xuất vỏ Bourne? Mục đích của nó là gì?

Lưu ý: Tôi quan tâm đến những gì thành ngữ này làm trong cả bashzsh .

Cảm ơn


Bạn đang yêu cầu zshhay bash?
enzotib

@enzotib, tôi quan tâm đến cả hai. Tôi đã làm rõ điều đó.
Amelio Vazquez-Reina

Câu trả lời:


31

Hãy chia nó thành từng mảnh.

Mã này chạy lệnh :với một số đối số. Lệnh :không làm gì và bỏ qua các đối số của nó. Do đó, toàn bộ dòng lệnh không làm gì cả, ngoại trừ bất kỳ tác dụng phụ nào xảy ra trong các đối số.

Cú pháp ${parameter_name:=value}tồn tại trong tất cả các shell kiểu Bourne không cổ, bao gồm tro, bash, ksh và zsh. Nó đặt tham số thành mặc định nếu cần thiết. Nó tương đương với

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

Nói cách khác, nếu parameter_namekhông được đặt hoặc được đặt thành một giá trị trống, thì hãy đặt nó thành giá trị được chỉ định; và sau đó chạy lệnh, sử dụng giá trị tham số mới. Có một biến thể, ${parameter_name=value}để trống tham số nếu nó trống, chỉ sử dụng giá trị được chỉ định nếu tham số không được đặt.

Bạn sẽ tìm thấy cú pháp này được ghi lại dưới phần mở rộng tham số của Wap trong thông số POSIX và hướng dẫn sử dụng dấu gạch ngang, bash, ksh và zsh.

Có các biến thể về cú pháp này, đặc biệt ${parameter_name:-value}cho phép bạn sử dụng một giá trị mặc định cho việc mở rộng này mà không cần gán cho tham số.

Tóm lại, : ${parameter_name:=value}là một cách viết súc tích

if [ -z "$parameter_name" ]; then parameter_name=value; fi

11

:không có nghĩa là đúng - có lẽ bạn đang nghĩ đến while :, nhưng ngay cả trong biểu hiện đó cũng không có nghĩa là "đúng", nó chỉ đơn thuần là đánh giá nó (thực tế, nó chỉ đơn giản là một lệnh null hoặc noop).

Tham số mở rộng ( ${x:=y}) này có nghĩa là "gán y cho x nếu x không được đặt hoặc trống và mở rộng thành y ".

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

Wiki Bashers có một bài viết hay về mở rộng tham số ở đây .

Lý do :được sử dụng là trong khi các phần khác của lệnh được ước tính, chúng không được thực hiện (như :là một lệnh null). Do đó, bạn đã ${x:=y}thực hiện chức năng của nó mà không ảnh hưởng đến bất cứ điều gì khác, ví dụ, nếu bạn không có: ngay từ đầu, nó sẽ cố gắng thực hiện một lệnh gọi là y .

Đây là bashtrang trợ giúp về ::

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

Đầu tiên : là một lệnh, nó được gọi là "noop" hoặc "không hoạt động". Như đã nói trong manpage, nó thường được sử dụng để đánh giá các đối số.

Thứ hai :là một vòng loại trong việc mở rộng biến - về mặt kỹ thuật là như vậy :=. Như đã nói, cái này đặt giá trị nếu nó không có giá trị.

Thành ngữ khôn ngoan, nếu bạn cần một giá trị mặc định của biến môi trường, thì bạn có thể sử dụng cú pháp này. Ví dụ: khi chạy chương trình qua cron(8), môi trường không được đặt và các tệp chấm của shell không chạy. Vì vậy, bạn có thể cần phải thiết lập một số mặc định.

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

Sau đó, bạn có thể 'đặt nó và quên nó' (cho đến khi jvm mặc định thay đổi).

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.