bwangel23
11/23/2016 - 2:19 AM

ABS Arrays

ABS Arrays

#!/bin/bash
#
# Author: bwangel<bwangel.me@gmail.com>
# Date: Nov,28,2016 11:54

# 空数组和空元素
array0=( one two three four )
array1=( '' )
array2=(  )
array3=(    )

ListArray() {
    # 列出四个数组
    printf "array0: |%s|\n" "${array0[*]}"
    printf "array1: |%s|\n" "${array1[*]}"
    printf "array2: |%s|\n" "${array2[*]}"
    printf "array3: |%s|\n" "${array3[*]}"

    echo "--------------"

    # 列出四个数组的第一个元素的长度
    printf "array0: |%d|\n" ${#array0}
    printf "array1: |%d|\n" ${#array1}
    printf "array2: |%d|\n" ${#array2}
    printf "array3: |%d|\n" ${#array3}

    echo "--------------"

    # 列出四个数组中元素的个数
    printf "array0: |%d|\n" ${#array0[@]}
    printf "array1: |%d|\n" ${#array1[@]}
    printf "array2: |%d|\n" ${#array2[@]}
    printf "array3: |%d|\n" ${#array3[@]}

    echo "--------------"
}

ListArray

# 扩展这些数组,添加新元素
## 1. 构建新数组

array0=( "${array0[@]}" "new" )
array1=( "${array1[@]}" "new" )
array2=( "${array2[@]}" "new" )
array3=( "${array3[@]}" "new" )

ListArray

## 2. 在原有数组上添加元素
# 这种方法将元素当成了栈,执行一些 PUSH POP 操作

array0[${#array[@]}]="new1"

# 对数组进行切片

start=1
end=3
echo "${array0[@]:${start}:${end}}"

# 利用正则进行替换

echo "${array0[@]/two/2}"

# 利用正则替换所有

echo "${array0[@]//new/n}"

echo "----------------"


# 利用#*获取数组中的元素
## 这里的#是指删除匹配的元素再来构成新的数组
echo ${array0[@]}
array4=( ${array0[@]#*new} )
echo ${array4[@]}

array5=( ${array0[@]#new1} )
echo ${array5[@]}

## // 也会删除匹配的元素来构成新的数组
array6=( ${array0[@]/new1/} )
echo ${array6[@]}

zap='new*'
array9=( ${array0[@]/$zap/} )
echo
echo "Number of elements in array9:  ${#array9[@]} "
array9=( "${array0[@]/$zap/}" )
echo "Elements in array9:  ${array9[@]}"
echo "Number of elements in array9:  ${#array9[@]} "


# Just when you thought you were still in Kansas . . .
array10=( ${array0[@]#$zap} )
echo
echo "Elements in array10:  ${array10[@]}"
# But, the asterisk in zap won't be interpreted if quoted.
array10=( ${array0[@]#"$zap"} )
echo
echo "Elements in array10:  ${array10[@]}"

exit
#!/bin/bash
#
# Author: bwangel<bwangel.me@gmail.com>
# Date: Nov,27,2016 15:20

# 声明一个数组变量
declare -a color_array

# 利用 read 读取三种颜色
read -a color_array <<< "yellow blue green"
## 注意如果输入 yellow "blue color" green 将会被识别成四个元素

# 利用 while 循环来输出所有元素
index=0
while [[ $index < ${#color_array[@]} ]];do
    echo $index, ${color_array[index]}
    let "index = $index + 1"
done

for item in ${color_array[@]}
do
    printf "%s\n" "${item}"
done

echo "-------"

# 直接输出所有元素
printf "%s\n" "${color_array[@]}"

# 删除数组中的一个元素并输出长度
unset color_array[2]
echo ${#color_array[@]}

# 删除整个数组并尝试输出这个数组
unset color_array
printf "array is |%s|\n" "${color_array[@]}"
#!/bin/bash
#
# Author: bwangel<bwangel.me@gmail.com>
# Date: Nov,27,2016 14:36

# 将一个脚本的内容载入到一个数组中去

readarray script_content < "$0"

# printf 函数,将字符串进行格式化
# 用法: printf [-v var] format [arguments]
# 注意 arguments 是以空格分割的,所以变量要用""包裹起来,否则变量就会被识别成多个参数
for index in ${!script_content[@]}
do
    printf "%2d %s" "${index}" "${script_content[$index]}"
done
#!/bin/bash
#History:
#   Michael	Nov,24,2016
#Program:
#

array=(zero one two three four five fivefive)

echo

# 类似于Python中的切片,第一个数字为起始位置下表,第二个数字为要打印的 item 的个数,如果没有则打印全部
echo ${array[@]:0}
echo ${array[@]:1}
echo ${array[@]:2:3}    # three four five

echo "--------------"

echo ${array[@]#f*r}

# # 表示从字符串的前面开始匹配
# 注意##表示对字符串进行最长的匹配
# 这里是对数组的每个成员都进行匹配并删除
echo ${array[@]#t*e}    # zero two e four five
echo ${array[@]##t*e}   # zero two four five


# % 表示从字符串的尾部进行匹配
# %% 表示从字符串的尾部进行最长匹配
echo ${array[@]%h*e}
echo ${array[@]%%t*e}

test="efgabcdefg"
echo ${test#efg}
echo ${test%efg}

echo "|${test%%e*g}|"

echo "----------------------"

# 挨个查找数组中的每一个元素,进行替换
# 替换第一次遇见的子串
echo ${array[@]/fiv/XYZ}

# 替换所有的子串
echo ${array[@]//iv/YY}

# 没有指定要替换的内容就是删除
echo ${array[@]//fi/}   # 全部删除
echo ${array[@]/fi/}    # 第一次匹配删除

# 注意这里的字符串替换就没有最长匹配了
# 从头部开始进行替换
echo ${array[@]/#fi/XY}

# 从尾部开始进行替换
echo ${array[@]/%ve/ZZ}
echo ${array[@]/%o/XY}

echo "----------------------"

# 在替换的内容中使用bash语句
replacement() {
    echo -n "!!!"
}

replace_with_argument() {
    echo -n "$1!!!"
}

echo ${array[@]/%e/$(replacement)}
echo ${array[@]//*/$(replace_with_argument test)}

echo "-----------------------"
for item in ${array[@]};do
    if [[ 1 ]];then
        echo -n ${item}" "
    fi
done

echo

exit 0
#!/bin/bash
#
# Author: bwangel<bwangel.me@gmail.com>
# Date: Nov,25,2016 15:42

array=(one two three four five six seven)

# 访问数组的元素
echo ${array[0]}

# 对array[0]进行切片操作
echo ${array:0}
echo ${array:1}

# 获取array[0]的长度
echo ${#array[0]}
echo ${#array}

# 获取 array[2] 的长度
echo ${#array[2]}

# 获取 array 的长度
echo ${#array[*]}
echo ${#array[@]}

echo "--------------------------"

array2=([0]="first element" [1]="second element" [2]="third element")

echo ${array2[0]}
echo ${array2[1]}
echo ${array2[2]}

echo "|"${array2[3]}"|" # 访问不存在的元素将会是空

# 注意这里判断空的两种正确方式
if [ "${array2[3]}" == "" ];then
# if [[ ${array2[3]} == "" ]];then
# 下面这种方式是错误的,它将会表达成 if [ == "" ];then,从而出现语法错误
# if [ ${array2[3]} == "" ];then
    echo "Array2[3] is NULL"
fi

# 分别获取数组中第三个元素的长度和数组的长度
echo ${#array2[2]}
echo ${#array2[@]}
#!/bin/bash
#History:
#   Michael	Nov,24,2016
#Program:
#

# 诗的内容
Line[1]="I do not known which to prefer,"
Line[2]="The beauty of inflections"
Line[3]="Or the beauty of innuendoes,"
Line[4]="The blackbird whistling"
Line[5]="Or just after."

Attrib[1]=" Wallace Stevens"
Attrib[2]="\"Thirteen Ways of Looking at a Blackbird\""

echo

tput bold
for index in $(seq 5);do
    printf "    %s\n" "${Line[index]}"
done

for index in $(seq 2);do
    printf "        %s\n" "${Attrib[index]}"
done
tput sgr0

echo

exit 0
#!/bin/bash
#History:
#   Michael	Nov,23,2016
#Program:
#

# 数组成员比一定要是连续的,中间有断层也可以
# 事实上,有分离数据的数组更有利于电子表格的处理
area[11]=23
area[13]=27
area[51]=UFOs

echo -n "area[11] = "
echo ${area[11]}

echo -n "area[12] = "
echo ${area[12]}

echo -n "area[13] = "
echo ${area[13]}

echo "Content of area[51] are ${area[51]}"

# 未初始化的数组成员将会打印空白
echo -n "area[43] = "
echo ${area[43]}
echo "(area[43] unassigned)"

echo

# 求两个数组成员的和,赋值给第三个成员
area[5]=$(expr ${area[11]} + ${area[13]})
echo "area[11] + area[13] = area[5]"
echo "${area[11]} + ${area[13]} = ${area[5]}"

# 进行违法的加,程序会报错
area[6]=$(expr ${area[11]} + ${area[51]})
echo "area[11] + area[51] = area[6]"
echo "${area[11]} + ${area[51]} = ${area[6]}"

echo; echo; echo


# --------------------------------------------------
# 另外一个数组: area2
# 另外一种给数组赋值的方式 area2=( XXX YYY ZZZ ... )

area2=( zero one two three four )
echo "area2[0] = ${area2[0]}"
echo "area2[1] = ${area2[1]}"
# ---------------------------

echo; echo; echo

# -------------------------------------------------
# 数组area3展示了另外一种数组赋值的方式
# array_name=([xx]=XXX [yy]=YYY ...)

area3=([17]=seventeen [24]=twenty-four)

echo "area3[17] = ${area3[17]}"
echo "area3[24] = ${area3[24]}"
# ----------------------------

echo; echo; echo

# -------------------------------------------------
# 使用扩展的大括号展开语法来初始化一个数组

base64_charset=( {A..Z} {a..z} {0..9} '+' '/' '=')
echo ${base64_charset}      # 只会输出第一个成员
echo ${base64_charset[@]}    # 输出全部成员
echo ${base64_charset[*]}    # 输出全部成员
echo ${base64_charset[0]}       # 输出第一个成员
echo -n ${#base64_charset[*]}   # 输出数组的长度
#------------------------

echo; echo; echo

# -------------------------------------------------
# Bash 允许在变量上做数组操作,甚至这个变量没有显示地声明成数组也可以
# 下面这个例子将string认为是只有一个元素的数组

string=abcABC123abcABC
echo ${string[@]}
echo ${string[*]}
echo ${string[0]}
echo ${string[1]}   # 没有输出,因为这个数组只有一个元素
echo ${#string[@]}
# ----------------------------