数组
变量:用一个固定的字符串,代替一个不固定字符串
数组:用一个固定的字符串,代替多个不固定字符串
普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引
数组有多种定义方法。
一次赋一个值:数组名[下标]=变量值
array[0]=aaa
array[1]=bbb
array[2]=ccc
一次赋多个值:数组名=(值1 值2 值3)
array=(aaa bbb ccc)
array=(cat /etc/passwd
) 希望是将该文件中的每一行作为一个元素赋值给数组
访问数组元素
echo ${array[0]} 访问数组中的第一个元素
echo ${array[@]} 访问数组中所有元素 等同于echo ${array[*]}
echo ${#array[@]} 统计数组元素的个数
echo ${!array[@]} 获取数组元素的索引
echo ${array[@]:1} 从数组下标1开始
echo ${array[@]:1:2} 从数组下标1开始,访问两个元素
定义关联数组
每次定义关联数组前一定要先声明关联数组,
declare -A 数组名
定义方法与查看数组元素方式跟数组定义方法一样,也可一次定义一个值或多个值
数组名[索引]=变量值
while脚本快速定义数组
#!/bin/bash
#循环读取文件,定义数组
while read line
do
#hosts:数组名
#[++i]:索引递增,++i是1开始,i++是0开始。
#
l
i
n
e
:
值
,
即
文
件
中
的
内
容
h
o
s
t
s
[
+
+
i
]
=
line:值,即文件中的内容 hosts[++i]=
line:值,即文件中的内容hosts[++i]=line
done < /etc/hosts
#输出索引每一行
for i in
!
h
o
s
t
s
[
@
]
d
o
e
c
h
o
"
{!hosts[@]} do echo "
!hosts[@]doecho"i : KaTeX parse error: Expected '}', got 'EOF' at end of input: {hosts[i]}"
done
for脚本快速定义数组
不过使用for脚本快速定义数组每到一个空格即是一个数值,若想更改只需在脚本开始位置设置分隔符即可
OLD_IFS=$IFS 将旧的分隔符备份
IFS=S\n
定义for的分隔符是换行符
IFS=$OLD_IFS 脚本输入完以后记得在脚本末尾使用将分隔符还原,便于脚本后方的for使用
[root@localhost ~]# vim for_array.sh
#!/bin/bash
#2020
#for array
for line in cat /etc/hosts
do
hosts[++i]=$line
done
for i in
!
h
o
s
t
s
[
@
]
d
o
e
c
h
o
"
{!hosts[@]} do echo "
!hosts[@]doecho"i: KaTeX parse error: Expected '}', got 'EOF' at end of input: {hosts[i]}"
done
使用数组统计,用户shell的类型和数量
[root@localhost ~]# vim array.sh
#!/bin/bash
declare -A shells 数组声明并把数组名定义为shells
while read ll 定义数组 名字为 ll 并使用循环
do
type=echo $ll | awk -F: '{print $NF}'
把文本最后一列定义为type的变量
let shells[$type]++
done < /etc/passwd 把/etc/passwd文件的内容输入到本文本
for i in
!
s
h
e
l
l
s
[
∗
]
d
o
e
c
h
o
"
{!shells[*]} do echo "
!shells[∗]doecho"i: KaTeX parse error: Expected '}', got 'EOF' at end of input: {shells[i]}"
done
函数
函数是一段完成特定功能的代码片段(块)
在shell中定义了函数,就可以使代码模块化,便于复用代码
注意函数必须先定义才可以使用。
定义函数名
方法1
函数名 () {
函数要实现的功能代码
}
方法2
function 函数名 {
函数要实现的功能代码
}
调用函数
函数名 参数1 参数2
示例:阶乘函数
制作函数用户阶乘
#!/bin/bash
#定义函数名fun1
fun() {
#定义阶乘元数
factorial=1
#使阶乘循环
for((i=1;i<=5;i++)) 等同于 for i in ·seq 5·
do
#阶乘公式
factorial=
[
[
[factorial*KaTeX parse error: Expected 'EOF', got '#' at position 9: i] done #̲输出阶乘结果 echo “5的…factorial”
}
fun 读取结果
传参,让函数能够定义
#!/bin/bash
fun() {
factorial=1
for((i=1;i<=
1
;
i
+
+
)
)
d
o
f
a
c
t
o
r
i
a
l
=
1;i++)) do factorial=
1;i++))dofactorial=[
f
a
c
t
o
r
i
a
l
∗
factorial*
factorial∗i]
done
echo “
1
的
阶
乘
是
:
1的阶乘是:
1的阶乘是:factorial”
}
fun 3
fun 4
fun 5
传参2,由脚本外部传递参数
#!/bin/bash
fun () {
factorial=1
for((i=1;i<=
1
;
i
+
+
)
)
d
o
f
a
c
t
o
r
i
a
l
=
1;i++)) do factorial=
1;i++))dofactorial=[
f
a
c
t
o
r
i
a
l
∗
factorial*
factorial∗i]
done
echo “
1
的
阶
乘
是
:
1的阶乘是:
1的阶乘是:factorial”
}
fun $1
fun $2
fun $3
测试:
[root@localhost ~]# bash cc.sh 3 5 10
“3的阶乘是:6”
“5的阶乘是:120”
“10的阶乘是:3628800”