07-数组

一、数组

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值