bash -e thoát khi let hoặc expr ước tính thành 0


19

Tôi có một tập lệnh bash đặt -e để tập lệnh sẽ thoát trên bất kỳ trạng thái thoát nào! = 0.

Tôi đang cố gắng thực hiện một số số học cơ bản được gán cho các biến và đôi khi biểu thức bằng 0, khiến trạng thái thoát của lệnh let hoặc expr là "1".

Đây là một ví dụ:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"

Đầu ra là:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'

Câu hỏi của tôi là cách viết kịch bản bash thành ngữ để cho phép tập lệnh thất bại với các lỗi thoát thực và không phải là số học cơ bản bằng 0. Tôi có thể kết hợp tất cả các biểu thức đó với:

A=`expr $C - $D`    || true

Nhưng điều đó có vẻ hacky.

Câu trả lời:


16

Đừng sử dụng exprcho số học. Từ lâu, nó đã lỗi thời: các shell hiện có số học được xây dựng, với $((…))cấu trúc (POSIX) hoặc với letdựng sẵn (ksh / bash / zsh) hoặc ((…))cấu trúc (ksh / bash / zsh).

let((…))trả về 1 (mã trạng thái lỗi) nếu biểu thức được đánh giá cuối cùng là 0. Để tránh điều này khiến tập lệnh của bạn thoát ra bên dưới set -e, hãy sắp xếp cho biểu thức cuối cùng không trả về 0, ví dụ:

let "a = 2 - 2" 1
((a = 2 - 2, 1))

Ngoài ra, sử dụng || truethành ngữ:

((a = 2 - 2)) || true

Ngoài ra, làm số học của bạn bên trong $((…))và bài tập của bạn bên ngoài. Một phép gán trả về trạng thái thay thế lệnh cuối cùng trong giá trị hoặc 0 nếu không có lệnh thay thế, vì vậy bạn an toàn. Điều này có thêm lợi ích khi làm việc trong bất kỳ vỏ POSIX nào (chẳng hạn như dấu gạch ngang).

a=$((2 - 2))

1

Sử dụng $(( $C - $D ))thay thế cho arithmatic của bạn. Nó cũng hiệu quả hơn.


Điều gì làm cho nó hiệu quả hơn nói (( A = $C - $D ))?
giám mục


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.