一、数组
1、定义
# 方式一
数组名[]=元素
# 方式二
declare -a 数组名[]=元素
# 方式三
数组名=(this is a string)
- 第一种方式直接声明:123为字符串。其中下标可以用字符或者字符串表示。
边定义边使用
- 第二种方式:
规范
- 第三种方式:mk[0]=this,mk[1]=is
2、获取数组中的元素
1、获取一个
- ${arr[0]}
2、获取所有
- ${arr[*]}:位置参数的所有内容
- ${arr[@]}:位置参数的所有内容
3、获取数组长度
- ${#arr{*}}
- ${#arr{@}}
3、引用实例
+号左右都有空格 进行算术运算,否则直接进行字符串拼接:10+20
- array36[X]=10+20=30
- array40[X]=30+chen=报错:non-integer argument
- array50[X]=chen+xl=报错:
4、下标索引
array="hello world"
echo "${array[0]}" # hello world
5、关联数组
declare -A array:声明array为关联数组,防止数据被覆盖。
- ${array[flower]}=flower
- ${array[fruit]}=fruit
- ${#array[@]}=2
- ${#array[*]}=2
5、删除数组
unset linux[3] # 删除下标为3的内容
unset linux # 删除整个数组
二、数组的基本应用
1、元素的提取和替换
1.1 数组的提取格式【一定要注意提取的格式,和输出格式】
${array[*]:i:j} #从i位置开始读,j是读几个元素
#! /bin/bash
linux=("debian" "radhat" "ubuntu" "suse" "fedora" "uts" "centos")
str=(${linux[*]:2:4})
echo $str # ubuntu
echo ${str[*]} # ubuntu suse fedora uts
str=(${linux[4]:2:4})
echo $str # dora
1.2 数组的替换
#! /bin/bash
arr=(aaaa bbbbcc cdddd deeeeee)
echo ${arr[@]} # 打印数组 aaaa bbbbcc cdddd deeeeee
arr2=${arr[@]/*c/f} # 匹配替换 aaaa f fdddd deeeeee
echo ${arr2[@]}
echo ${arr[@]/d/o} # 单个替换 aaaa bbbbcc coddd oeeeeee
echo ${arr[@]} # 对原数组没有影响 aaaa bbbbcc cdddd deeeeee
2、删除子串、增加子串
#! /bin/bash
arr=(abcabc deffed aaabbbccc)
echo ${arr[@]#abc} #abc deffed aaabbbccc 开头最短
echo ${arr[@]##abc}#abc deffed aaabbbccc 开头最长
echo ${arr[@]#a*c}#abc deffed cc 开头最短
echo ${arr[@]##a*c}#deffed 开头最长
echo
echo ${arr[@]%abc}#abc deffed aaabbbccc 结尾最短
echo ${arr[@]%%abc}#abc deffed aaabbbccc 结尾最长
echo ${arr[@]%a*c}#abc deffed aa 结尾最短
echo ${arr[@]%%a*c}#deffed 结尾最长
echo
echo ${arr[@]/%/xd} # abcabcxd deffedxd aaabbbcccxd 每项添加
3、复制数组、连接数组
newarray=("${arr[@]}") # 复制一个新数组
#! /bin/bash
arr=()
arr1=("${arr[@]}" "xd")
echo "${arr1[@]}" # xd
echo "${#arr1[@]}" # 1
arr2=(${arr[@]} "xd")
echo "${arr2[@]}" # xd
echo "${#arr2[@]}" # 1
# ======当arr=("")时===================
xd # 第一个元素是空,第二个元素为xd
2
xd # 没有引号的结果:不列入数组元素
1
# 结论:数组定义不加引号,则不算素组元素
- 空元素:占位
- null:不占位
4、空数组
- 不经过初始化的数组,不占用内存空间
5、嵌套数组
#! /bin/bash
A=(a b c)
B=(b c d)
C=(c d e)
arr=("${A[@]}" "${B[@]}" "${C[@]}")
echo ${arr[@]} # a b c b c d c d e
echo ${#arr[@]}# 9
echo ${arr[1]}# b
echo ${arr[2][2]} # c
# =======当arr=("${A[*]}" "${B[*]}" "${C[*]}"):从而实现了二维数组=============
a b c b c d c d e
3
b c d
c d e
#结论:只能取到一层,若想取到第二层,则需要编写for循环,或者使用新数组
newarr=(${arr[2]})
echo ${newarr[@]} #c d e
echo ${newarr[2]} #e
6、文件内容加载到数组
# 默认为空格分隔
arr=(`ls`)
7、二维数组
#! /bin/bash
arr1=(a b c)
arr2=(d e f)
arr3=(g h i)
for ((i=1;i<4;i++))
do
eval value=\${arr${i}[*]} # 先执行${i} 后执行${arr1[*]}
for element in ${value} # 三个元素 三次循环
do
echo -e ${value} # 不换行输出
continue 2 # 跳过两次重复输出
done
done
# ===输出===
a b c
d e f
g h i
8、eval
eval主要用在对参数的特殊处理上面的,一般的命令行,shell处理参数就只执行一遍,像转义和变量转变;但加上eval后就可以对参数进行两边的处理
name=xd
cmd="echo hello $name"
eval $cmd
9、入栈、出栈函数
入栈:先移指针,再进数据
出栈:先出数据,再移指针
先进后出
三、作业
1、求学生成绩
#! /bin/bash
declare -a grade=(1 3 2 4 3 7 6 8 3 2) # 学生成绩
len="${#grade[*]}" # 获取长度
ave=0
max=0
for ((i=0;i<$len;i++))
do
let "sum=${grade[$i]}+sum" # 求和
done
echo "sum=$sum"
let "ave=sum/len"
awk 'BEGIN{printf "avr=%0.2f",'$sum/$len'}' # 保留两位输出
echo
# 给成绩排序
for((j=0;j<$len;j++))
do
for((k=$((j+1));k<$len;k++))
do
if [ ${grade[$j]} -lt ${grade[$k]} ]
then
temp=${grade[$j]}
grade[$j]=${grade[$k]}
grade[$k]=$temp
fi
done
done
echo "MAX:${grade[0]}"
echo "${grade[*]}"
2、斐波那契数列
# 斐波那契 常规
#! /bin/bash
echo "input your number"
read number
declare -a flag=1
f1=1
f2=1
while [ $flag -le $number ]
do
if [ $flag -gt 2 ]
then
echo -n " $((f1+f2)) "
f2=$((f1+f2))
f1=$((f2-f1))
fi
if [ $flag -eq 2 ]
then
echo -n " 1 "
fi
if [ $flag -eq 1 ]
then
echo -n " 1 "
fi
let "flag=flag+1"
done
echo
3、更改数组 无序??
#! /bin/bash
students=(john rose tom tim)
echo "the old students are : ${students[*]}"
studnets[0]=susan
students[3]=xd
echo "the new students are : ${students[*]}"
declare -A grades
grades=([john]=90 [rose]=87 [tom]=100 [tim]=99)
echo "the old grades are :${grades[@]}" # 99 87 100 90 无序???
grades[tim]=39
echo "the new grades ate : ${grades[@]}" # 39 87 100 90
4、调用函数、遍历数组
#! /bin/bash
# 遍历输出数组--函数的调用
func(){
i=0
while [ $# -gt 0 ]
do
echo -n "$i:"
echo -n " $1 "
shift
let "i=i+1"
done
}
arr=()
new_arr=("$arr" "123")
echo "new_arr:${new_arr[@]}"
echo "new_arr_len:${#new_arr[@]}"
func ${new_arr[@]}
echo
echo "======================"
new_arr2=("${arr}" "123")
echo "new_arr2:${new_arr2[@]}"
echo "new_arr2_len:${#new_arr2[@]}"
func ${new_arr2[@]}
echo