shell编程-数组与函数

34 篇文章 0 订阅

数组

变量:用一个固定的字符串,代替一个不固定字符串
数组:用一个固定的字符串,代替多个不固定字符串

普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引

数组有多种定义方法。
一次赋一个值:数组名[下标]=变量值
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* factoriali]
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* factoriali]
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”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值