Điểm:5

Toán tử tăng không hoạt động trên một biến nếu biến được đặt thành 0

lá cờ br

Tăng một biến var hoạt động trong bash khi được đặt trong dấu ngoặc kép như (( biến ++ )). Nhưng tôi thấy rằng nó không thành công nếu biến được đặt thành 0 trước đó như biến = 0.

$a=0
$ ((a++)) && echo "lệnh đã thành công" || tiếng vang "lệnh thất bại"
Lệnh không thành công

$a=1
$ ((a++)) && echo "lệnh đã thành công" || tiếng vang "lệnh thất bại"
lệnh đã thành công

Ai đó có thể giải thích hành vi này?

Môi trường:

Tôi đang sử dụng gnome-terminal trên Ubuntu Desktop 18.04.5 LTS.

pLumo avatar
lá cờ in
Tôi nghĩ bạn không nên thực sự vào trạng thái thoát của `((` để biết lệnh có hoạt động hay không.. *>> "Nếu kết quả của biểu thức là 0, mã trạng thái thoát được trả về sẽ là 1 hoặc âfalseâ , trong khi mã trạng thái thoát được trả về bởi một biểu thức giá trị khác 0 sẽ là 0 hoặc âtrueâ."* ([via](https://developpaper.com/functions-of-in-linux- vỏ-2))
wjandrea avatar
lá cờ cn
Lưu ý bên lề: có nhiều cách để [tăng một biến trong Bash](/q/385528/301745). Có lẽ cách thành ngữ nhất là đặt nó thành một số nguyên trước: `khai báo -i a=0` sau đó `a+=1`.
ilkkachu avatar
lá cờ co
@pLumo, không phải trạng thái thoát sai, mà là giả định của người dùng (của bạn cũng vậy). Nó hoạt động chính xác như phần tăng sau được xác định và chính xác như nó hoạt động trong ví dụ: C. Mặc dù bạn đúng ở chỗ bạn không thể sử dụng trạng thái thoát của `(( .. ))` để xem nó có _worked_ hay không, vì một lỗi cú pháp cũng khiến nó thoát với trạng thái 1. (chứ không phải ví dụ: 2, như `[` và `[[` do)
Saad Abdul Majid avatar
lá cờ br
@pLumo, tôi lo lắng về mã trạng thái thoát vì tập lệnh đang sử dụng `trap ... ERR` và dòng này kích hoạt nó. Hiện tại, tôi đã tránh được tình huống này bằng cách sử dụng phần tăng trước làm giá trị cơ sở của tôi là 0 cho `var`. Nhưng giải pháp này dành riêng cho trường hợp sử dụng của tôi. Có lẽ tôi nên tìm cách bỏ qua `bẫy` cho các câu lệnh được chọn/như vậy.
Điểm:10
lá cờ cn

Với tín dụng từ đây: https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

Giá trị trả về của (( biểu thức )) không biểu thị trạng thái lỗi, nhưng, từ trang bash:

((sự biểu lộ)) Biểu thức được đánh giá theo các quy tắc được mô tả bên dưới trong ĐÁNH GIÁ SỐ HỌC. Nếu giá trị của biểu thức là khác không, trạng thái trả về là 0; mặt khác, trạng thái trả về là 1. Điều này hoàn toàn tương đương với "biểu thức".

Trong ((a++))bạn đang làm một bài gia tăng. Giá trị của một0 Vì thế 1 được trả lại, sau đó, nó được tăng lên.

So sánh

$ bỏ đặt một
$ ((a++)) ; tiếng vang Mã thoát: $? một: $a
Mã thoát: 1 a: 1

đấu với

$ bỏ đặt một
$ ((++a)) ; tiếng vang Mã thoát: $? một: $a
Mã thoát: 0 a: 1

Một sự gia tăng trước, vì vậy một đã trở thành 10 Được trả lại.

wizzwizz4 avatar
lá cờ de
Về mặt kỹ thuật, sự gia tăng xảy ra trước khi trả lại; tuy nhiên, giá trị trả về là giá trị được lấy trước khi tăng.
Điểm:5
lá cờ jp

Điều này làm việc cho tôi (trong đánh đập trong Ubuntu),

$a=0
$ tiếng vang $((a++))
0
$ tiếng vang $((a++))
1
$ tiếng vang $((a++))
2
$ tiếng vang $((a++))
3
$ tiếng vang $a
4

Lưu ý sự khác biệt với

$a=0
$ tiếng vang $((++a))
1
$ tiếng vang $((++a))
2
$ tiếng vang $((++a))
3
$ tiếng vang $a
3
pLumo avatar
lá cờ in
kiểm tra `echo $?`.
sudodus avatar
lá cờ jp
@pLumo, echo $((a++)) in trước khi cập nhật, echo $((++a)) in sau khi cập nhật.
bac0n avatar
lá cờ cn
Mở rộng số học không phát ra trạng thái thoát không thấy kết nối?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.