Khái niệm ngôn ngữ lập trình để không đánh giá một biểu thức theo mặc định trong bash là gì?


8

Trong Bash, để tăng giá trị số nguyên được lưu trữ trong một biến, chúng ta cần sử dụng rõ ràng việc mở rộng số học.

 i=1
 i=$((i+1))

Nếu không thì

 i=1
 i=i+1

sẽ không đánh giá biểu thức i+1, nhưng gán biểu thức dưới dạng chuỗi cho biến.

Điều này rất không tự nhiên so với các ngôn ngữ lập trình khác, trong đó một biểu thức được đánh giá theo mặc định.

Trong thiết kế ngôn ngữ lập trình hoặc các khái niệm, có một khái niệm hoặc thuật ngữ cho một tính năng như vậy trong bash không?

Điểm không đánh giá một biểu thức nhưng mặc định coi nó là một chuỗi là gì?

Là tính năng này liên quan đến thời gian đánh giá, chẳng hạn như đánh giá lười biếng?

Cảm ơn.


Ai nói bash là ngôn ngữ lập trình? và không có, nó không phải vì lười biếng đánh giá: tồn tại này bằng các ngôn ngữ khác cũng không có vấn đề chuỗi
Christophe

8
@ Ai nói bash là ngôn ngữ lập trình? Vâng Wikipedia , Stack Overflow , reddit , wikibooks . Và đó chỉ là những cái tôi có thể đặt tên trước khi chán. Cũng giống như Java, có nhiều thứ mang tên bash hơn là ngôn ngữ. Nhưng vâng, có một ngôn ngữ lập trình bash.
candied_orange

Câu trả lời:


15

Không có khái niệm đặc biệt ở đây. Thay vào đó, mọi thứ trong shell là một chuỗi ký tự, trừ khi bạn rõ ràng sử dụng một bản mở rộng. Quyết định thiết kế này giúp dễ dàng gán, các giá trị theo nghĩa đen, là trường hợp sử dụng chính của các bài tập:

varname=value

không tìm kiếm một biến được gọi value, nhưng sử dụng chuỗi theo valuenghĩa đen. Trong bash, hầu hết các ký tự đặc biệt của người Viking như + - /v.v ... không đặc biệt theo bất kỳ cách nào - chúng chỉ là một phần của các từ theo nghĩa đen giống như các ký tự chữ cái.

Cú pháp mở rộng cho phép chúng ta dễ dàng nhúng các giá trị bên trong một mẫu, ví dụ:

echo "Hello ${name}!"

(Lưu ý rằng trong shell, các trích dẫn thích '…'hoặc "…"không phân định chuỗi, thay vào đó chúng thay đổi mở rộng được áp dụng - trích dẫn đơn ngăn chặn tất cả các mở rộng và tách từ, trích dẫn kép ngăn chặn tách từ và mở rộng toàn cầu nhưng không mở rộng biến đổi, mở rộng số học (chỉ Bash) ., hoặc lệnh thay Những lời sau đây là tương đương: foo\ bar, foo' 'bar, 'foo bar').

Hậu quả của tất cả mọi thứ là một chuỗi theo cách tiếp cận mặc định là các chương trình không chỉ sử dụng các chuỗi đơn giản trở nên phức tạp hơn. Cú pháp mảng của Bash nổi tiếng là khó hiểu. Mở rộng số học có phần không rõ ràng. Tuy nhiên, các chương trình như vậy không phù hợp nhất cho các kịch bản shell.

Đề nghị đọc: Mô tả POSIX về cú pháp shell và ngữ nghĩa: http://pub.opengroup.org/onlinepub/9699919799/utilities/V3_chap02.html


7

Bạn có thể làm cho nó hoạt động như thế nếu bạn muốn. Tất cả mọi thứ trong shell là một chuỗi ký tự, trừ khi bạn nói rõ ràng nó là một thứ khác. Ví dụ, các bản in sau 2:

typeset -i x
x=1
x=x+1
echo $x

Bạn chỉ cần nói với shell rằng biến là một số nguyên thay vì một chuỗi. Điều tương tự cũng đúng nếu bạn muốn biến là một mảng.


Những gì bạn nói là đúng và hữu ích, nhưng không trả lời câu hỏi thực tế, đó là "khái niệm ngôn ngữ lập trình [...]" là gì?
Andres F.


0

Khái niệm ở đây là "tương thích ngược". Shell Bourne coi mọi thứ là các chuỗi, do đó, bash cũng phải mặc định hoặc tất cả các tập lệnh trước bash sẽ bị hỏng.

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.