mirror of https://github.com/tLDP/LDP
127 lines
3.0 KiB
Bash
127 lines
3.0 KiB
Bash
#!/bin/bash
|
|
# empty-array.sh
|
|
|
|
# Thanks to Stephane Chazelas for the original example,
|
|
#+ and to Michael Zick for extending it.
|
|
|
|
|
|
# An empty array is not the same as an array with empty elements.
|
|
|
|
array0=( first second third )
|
|
array1=( '' ) # "array1" has one empty element.
|
|
array2=( ) # No elements... "array2" is empty.
|
|
|
|
echo
|
|
ListArray()
|
|
{
|
|
echo
|
|
echo "Elements in array0: ${array0[@]}"
|
|
echo "Elements in array1: ${array1[@]}"
|
|
echo "Elements in array2: ${array2[@]}"
|
|
echo
|
|
echo "Length of first element in array0 = ${#array0}"
|
|
echo "Length of first element in array1 = ${#array1}"
|
|
echo "Length of first element in array2 = ${#array2}"
|
|
echo
|
|
echo "Number of elements in array0 = ${#array0[*]}" # 3
|
|
echo "Number of elements in array1 = ${#array1[*]}" # 1 (surprise!)
|
|
echo "Number of elements in array2 = ${#array2[*]}" # 0
|
|
}
|
|
|
|
# ===================================================================
|
|
|
|
ListArray
|
|
|
|
# Try extending those arrays
|
|
|
|
# Adding an element to an array.
|
|
array0=( "${array0[@]}" "new1" )
|
|
array1=( "${array1[@]}" "new1" )
|
|
array2=( "${array2[@]}" "new1" )
|
|
|
|
ListArray
|
|
|
|
# or
|
|
array0[${#array0[*]}]="new2"
|
|
array1[${#array1[*]}]="new2"
|
|
array2[${#array2[*]}]="new2"
|
|
|
|
ListArray
|
|
|
|
# When extended as above; arrays are 'stacks'
|
|
# The above is the 'push'
|
|
# The stack 'height' is:
|
|
height=${#array2[@]}
|
|
echo
|
|
echo "Stack height for array2 = $height"
|
|
|
|
# The 'pop' is:
|
|
unset array2[${#array2[@]}-1] # Arrays are zero based
|
|
height=${#array2[@]}
|
|
echo
|
|
echo "POP"
|
|
echo "New stack height for array2 = $height"
|
|
|
|
ListArray
|
|
|
|
# List only 2nd and 3rd elements of array0
|
|
from=1 # Zero based numbering
|
|
to=2 #
|
|
declare -a array3=( ${array0[@]:1:2} )
|
|
echo
|
|
echo "Elements in array3: ${array3[@]}"
|
|
|
|
# Works like a string (array of characters)
|
|
# Try some other "string" forms
|
|
|
|
# Replacement
|
|
declare -a array4=( ${array0[@]/second/2nd} )
|
|
echo
|
|
echo "Elements in array4: ${array4[@]}"
|
|
|
|
# Replace all matching wildcarded string
|
|
declare -a array5=( ${array0[@]//new?/old} )
|
|
echo
|
|
echo "Elements in array5: ${array5[@]}"
|
|
|
|
# Just when you are getting the feel for this...
|
|
declare -a array6=( ${array0[@]#*new} )
|
|
echo # This one might surprise you
|
|
echo "Elements in array6: ${array6[@]}"
|
|
|
|
declare -a array7=( ${array0[@]#new1} )
|
|
echo # After array6 this should not be a surprise
|
|
echo "Elements in array7: ${array7[@]}"
|
|
|
|
# Which looks a lot like...
|
|
declare -a array8=( ${array0[@]/new1/} )
|
|
echo
|
|
echo "Elements in array8: ${array8[@]}"
|
|
|
|
# So what can one say about this?
|
|
|
|
# The string operations are performed on
|
|
#+ each of the elements in var[@] in succession.
|
|
# Therefore : BASH supports string vector operations
|
|
# If the result is a zero length string, that
|
|
#+ element disappears in the resulting assignment.
|
|
|
|
# Question, are those strings hard or soft quotes?
|
|
|
|
zap='new*'
|
|
declare -a array9=( ${array0[@]/$zap/} )
|
|
echo
|
|
echo "Elements in array9: ${array9[@]}"
|
|
|
|
# Just when you thought you where still in Kansas...
|
|
declare -a array10=( ${array0[@]#$zap} )
|
|
echo
|
|
echo "Elements in array10: ${array10[@]}"
|
|
|
|
# Compare array7 with array10
|
|
# Compare array8 with array9
|
|
|
|
# Answer, must be soft quotes.
|
|
|
|
exit 0
|