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[@]}
# ----------------------------