Theo như tôi đã thấy, có hai cách để khởi tạo một biến với đầu ra của một tiến trình. Có sự khác biệt nào giữa hai cái này không?Các cách khác nhau để khởi tạo biến số
ex1=`echo 'hello world'`
ex2=$(echo 'hello world')
Theo như tôi đã thấy, có hai cách để khởi tạo một biến với đầu ra của một tiến trình. Có sự khác biệt nào giữa hai cái này không?Các cách khác nhau để khởi tạo biến số
ex1=`echo 'hello world'`
ex2=$(echo 'hello world')
Bạn sẽ có được hiệu ứng tương tự.
Các $()
được khuyến nghị vì nó dễ đọc hơn và giúp dễ dàng làm tổ một $()
thành một $()
khác.
Cập nhật:
Cú pháp $()
là một 1003.1 tiêu chuẩn POSIX (2004 edition). Tuy nhiên, trên một số hệ thống UNIX cũ hơn (SunOS, HP-UX, vv), /bin/sh
không hiểu nó.
Bạn có thể cần phải sử dụng backtick "` "thay vào đó hoặc sử dụng một trình bao khác (thường là ksh) nếu bạn cần tập lệnh của bạn để làm việc trên môi trường như vậy.
Nếu bạn không biết sử dụng cú pháp nào - hãy sử dụng $()
. Cú pháp backtick không được chấp nhận.
thấy http://mywiki.wooledge.org/BashFAQ/082
cũng nhận thấy rằng $()
là POSIX để nó không làm việc trên sh.
Có một cách khác để khởi tạo biến thành mặc định nếu bạn chưa tự khởi tạo biến đó.
[jaypal:~/Temp] a="I have initialized var a"
[jaypal:~/Temp] echo ${a:="Default value"}
I have initialized var a
[jaypal:~/Temp] a=
[jaypal:~/Temp] echo ${a:="Default value"}
Default value
Vì vậy, toán tử đó đọc giá trị mới của biến và xuất ra giá trị cũ. :) –
Nó thường được sử dụng khi bạn truyền các giá trị cho tập lệnh của bạn dưới dạng '$ 1',' $ 2' và giúp tập lệnh của bạn chạy ngay cả khi các giá trị đó không được chuyển một cách rõ ràng. Bằng cách này, bạn có thể ngầm đặt các biến của mình để chạy trên các giá trị mặc định nếu một giá trị chưa được gán cho chúng. Điều này tiết kiệm khoảng 4-5 dòng mã mà bạn kiểm tra nếu biến đã được gán hay không, cái gì đó giống như 'if [-z" $ var "] sau đó; … ' –
Tôi tin rằng, chúng tôi có thể sử dụng, echo $ {a: =" Giá trị mặc định "} hoặc echo $ {a: -" Giá trị mặc định "} – Indrajeet
@samus: $() thực sự là POSIX (1003.2 tôi nghĩ), nhưng nó sẽ không hoạt động trên UNIX cũ. Hãy tin tôi - Tôi sử dụng chúng hàng ngày. –
nhưng đó là điểm, khi chúng ta nói về tính di động, chúng tôi có nghĩa là POSIX vì nó là tiêu chuẩn hiện tại được hỗ trợ bởi hầu hết các nền tảng, nếu bạn có yêu cầu cụ thể vượt quá điều này thì đó là một trường hợp cụ thể. –
@samus: Bằng "di động nhiều hơn", tôi có nghĩa là "hoạt động trên nhiều hệ điều hành" không "tương thích với chuẩn POSIX mới hơn". –