หากคุณต้องการตรวจจับอาร์เรย์ด้วยองค์ประกอบที่ว่างเปล่าเช่น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อื่น ๆ )