Nếu bạn muốn phát hiện một mảng có các phần tử trống , nhưarr=("" "")
trống, giống nhưarr=()
Bạn có thể dán tất cả các yếu tố lại với nhau và kiểm tra xem kết quả có độ dài bằng không. (Xây dựng một bản sao phẳng của nội dung mảng không lý tưởng cho hiệu suất nếu mảng có thể rất lớn. Nhưng hy vọng bạn không sử dụng bash cho các chương trình như vậy ...)
Nhưng "${arr[*]}"
mở rộng với các yếu tố được phân tách bằng ký tự đầu tiên của IFS
. Vì vậy, bạn cần lưu / khôi phục IFS và thực hiện IFS=''
để thực hiện công việc này, nếu không thì kiểm tra xem độ dài chuỗi == # của các phần tử mảng - 1. (Một mảng các n
phần tử có n-1
dấu phân cách). Để giải quyết vấn đề đó, cách dễ nhất là ghép phần 1
arr=("" "")
## Assuming default non-empty IFS
## TODO: also check for ${#arr[@]} -eq 0
concat="${arr[*]} " # n-1 separators + 1 space + array elements
[[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
trường hợp thử nghiệm với set -x
### a non-empty element
$ arr=("" "x")
+ arr=("" "x")
$ concat="${arr[*]} "; [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
+ concat=' x '
+ [[ 3 -ne 2 ]]
+ echo not empty array
not empty array
### 2 empty elements
$ arr=("" "")
+ arr=("" "")
$ concat="${arr[*]} "; [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
+ concat=' '
+ [[ 2 -ne 2 ]]
+ echo empty array
empty array
Thật không may, điều này không thành công cho arr=()
: [[ 1 -ne 0 ]]
. Vì vậy, trước tiên bạn cần kiểm tra các mảng thực sự trống.
Hoặc vớiIFS=''
. Có lẽ bạn muốn lưu / khôi phục IFS thay vì sử dụng một lớp con, bởi vì bạn không thể nhận được kết quả từ một lớp con một cách dễ dàng.
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
thí dụ:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
không hoạt động với arr=()
- nó vẫn chỉ là chuỗi rỗng.
=
là một toán tử chuỗi. Nó hoạt động tốt trong trường hợp này, nhưng-eq
thay vào đó tôi sẽ sử dụng toán tử số học thích hợp (chỉ trong trường hợp tôi muốn chuyển sang-ge
hoặc-lt
, v.v.).