หากคุณต้องการตรวจจับอาร์เรย์ด้วยองค์ประกอบที่ว่างเปล่าเช่นarr=("" "")
ที่ว่างเปล่าเช่นเดียวกับarr=()
คุณสามารถวางองค์ประกอบทั้งหมดเข้าด้วยกันและตรวจสอบว่าผลลัพธ์มีความยาวเป็นศูนย์หรือไม่ (การสร้างสำเนาของเนื้อหาอาเรย์แบบแบนไม่เหมาะสำหรับประสิทธิภาพหากอาเรย์นั้นมีขนาดใหญ่มาก แต่หวังว่าคุณจะไม่ใช้ bash สำหรับโปรแกรมเช่นนั้น ... )
แต่การขยายตัวขององค์ประกอบที่แยกจากกันโดยตัวอักษรตัวแรกของ"${arr[*]}"
IFS
ดังนั้นคุณต้องบันทึก / กู้คืน IFS และทำIFS=''
เพื่อให้งานนี้หรืออื่น ๆ ตรวจสอบว่าความยาวสตริง == # ขององค์ประกอบอาร์เรย์ - 1 (อาร์เรย์ของn
องค์ประกอบที่มีn-1
ตัวคั่น) หากต้องการจัดการกับข้อผิดพลาดนั้นเป็นเรื่องง่ายที่สุดในการลดความต่อเนื่อง 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
กรณีทดสอบด้วย 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
น่าเสียดายที่สิ่งนี้ล้มเหลวสำหรับarr=()
: [[ 1 -ne 0 ]]
. ดังนั้นคุณจะต้องตรวจสอบอาร์เรย์ที่ว่างเปล่าจริงก่อนแยกกัน
IFS=''
หรือมีการ อาจเป็นไปได้ว่าคุณต้องการบันทึก / กู้คืน IFS แทนที่จะใช้ subshell เนื่องจากคุณไม่สามารถรับผลลัพธ์จาก subshell ได้อย่างง่ายดาย
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
ตัวอย่าง:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
ไม่ทำงานกับarr=()
- มันยังคงเป็นเพียงสตริงที่ว่างเปล่า
=
เป็นผู้ประกอบการสตริง มันทำงานได้ดีในกรณีนี้ แต่ฉันจะใช้ตัวดำเนินการทางคณิตศาสตร์ที่เหมาะสม-eq
แทน (ในกรณีที่ฉันต้องการเปลี่ยนเป็น-ge
หรือ-lt
อื่น ๆ )