Linux系统Shell编程及自动化运维实现-数组和函数
- 一.数组
-
- 1.数组简介
- 2.类型
- 3.普通数组
-
- 4.关联数组
-
- 5.数组和循环
- 6.案例
- 二.函数
-
- 1.概述
- 2.定义函数
- 3.调用函数
- 4.示例
-
- 4.1示例1:初识函数
- 4.2示例2:阶乘函数(传参)
- 4.3示例3:函数传参 数组传参
- 4.4示例4:函数结果 赋予数组
- 三.影响shell程序的内置命令
-
- 1.概览
- 2.continue/break/shift
一.数组
1.数组简介
- 变量:用一个固定的字符串,代替一个不固定字符串。
- 数组:用一个固定的字符串,代替多个不固定的字符串。
2.类型
- 普通数组:只能使用整数作为数组索引
- 关联数组:可以使用字符串作为数组索引
- 图示:
- 总结:变量切片有个索引的概念。一个索引(整数)对应一个字符。
普通数组:数组中的索引对应一个字符串。
关联数组:数组中的索引可以使用字符串。
3.普通数组
3.1定义数组
数组名[下标]=变量值
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
declare -a array1='([0]="aaa" [1]="bbb" [2]="ccc")'
[root@localhost ~]
aaa bbb ccc
[root@localhost ~]
[root@localhost ~]
a1 b1 c1
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
3.2访问数组元素
访问数组元数:
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
4.关联数组
4.1定义关联数组
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
ccc bbb aaa
[root@localhost ~]
[root@localhost ~]
ddd bbb aaa
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
bash shell
4.2访问数组元素
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
5.数组和循环
6.案例
[root@localhost ~]
while read line
do
hosts[++i]=$line
done < /etc/hosts
for i in ${
!hosts[@]}
do
echo "$i : ${hosts[$i]}"
done
[root@localhost ~]
1 :127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 : ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]
for line in `cat /etc/hosts`
do
hosts[i++]=$line
done
for i in ${
!hosts[@]}
do
echo "$i---"
echo "${hosts[$i]}"
done
[root@localhost ~]
0---
127.0.0.1
1---
localhost
2---
localhost.localdomain
3---
localhost4
4---
localhost4.localdomain4
5---
::1
6---
localhost
7---
localhost.localdomain
8---
localhost6
9---
localhost6.localdomain6
---解决for循环的空格分割问题:IFS=$'\n'---
[root@localhost ~]
OLD_IFS=$IFS
IFS=$'\n'
for line in `cat /etc/hosts`
do
hosts[i++]=$line
done
for i in ${
!hosts[@]}
do
echo "$i---"
echo "${hosts[$i]}"
done
IFS=$OLD_IFS
---1.定义性别文本---
[root@localhost ~]
jack m
alice f
tom m
---2.定义脚本统计性别---
[root@localhost ~]
declare -A sex
while read line
do
type=`echo $line|awk '{print $2}'`
let sex[$type]++
done < sex.txt
for i in ${
!sex[@]}
do
echo "$i : ${sex[$i]}"
done
---3.测试脚本---
[root@localhost ~]
f : 1
m : 2
[root@localhost ~]
declare -A shells
while read ll
do
type=`echo $ll | awk -F: '{print $NF}'`
let shells[$type]++
done < /etc/passwd
for i in ${
!shells[@]}
do
echo "$i : ${shells[$i]}"
done
[root@localhost ~]
/sbin/nologin : 39
/bin/sync : 1
/bin/false : 1
/bin/bash : 6
/sbin/shutdown : 1
/sbin/halt : 1
二.函数
1.概述
- 概念:函数是一段完成特定功能的代码片段(块)
在shell中定义了函数,就可以使代码模块化,便于复用代码
注意函数必须先定义才可以使用。
- 重点:传参 $ 1,$ 2
局部变量 local
返回值 return 即$ ?
2.定义函数
- 方法一:
函数名(){
函数要实现的功能代码
}
- 方法二:
function 函数名{
函数要实现的功能代码
}
3.调用函数
4.示例
4.1示例1:初识函数
--- 需求 ---
编写循环脚本,功能菜单
provide these tools:
show disk info(d)
show mem info(m)
show cpu info(c)
quit(q)
--- 思路 ---
1.编写菜单和判断
2.添加循环
3.添加函数
--- 演示1 ---
[root@localhost ~]
show_menu() {
cat << EOF
provide these tools:
show disk info(d)
show mem info(m)
show cpu info(c)
quit(q)
EOF
}
while :
do
show_menu
read -p "Input choice: " choice
case $choice in
d)
echo "===========disk info=============="
df -hT
;;
m)
echo "==========meme info==============="
free -m
;;
c)
echo "==========cpu info================="
uptime
;;
q)
break
;;
*)
show_menu
;;
esac
done
4.2示例2:阶乘函数(传参)
--- 需求 ---
制作函数用于阶乘
--- 思路 ---
1.了解阶乘概念
2.定义函数
3.引用函数
--- 演示 ---
[root@localhost ~]
fun(){
factorial=1
for((i=1;i<=$1;i++))
do
factorial=$[$factorial*$i]
done
echo "$1 阶乘: $factorial"
}
fun $1
4.3示例3:函数传参 数组传参
--- 1.阶乘脚本,通过数组给函数传参
[root@localhost ~]
num=(1 2 3)
num2=(4 5 6)
array(){
factorial=1
for i in $*
do
factorial=$[factorial*$i]
done
echo $factorial
}
array ${
num[*]}
array ${
num2[*]}
--- 2.数组好处在于多个数组时传参效率增高 ---
4.4示例4:函数结果 赋予数组
--- 1.通过函数输出到数组 ---
[root@localhost ~]
num=(1 2 3)
array(){
for i in $*
do
outarray[j++]=$[$i+5]
done
echo "${outarray[*]}"
}
result=`array ${
num[*]}`
echo ${
result[*]}
--- 2.函数不仅可以从数组中调取值,还可以赋予数组值
三.影响shell程序的内置命令
1.概览
:
true
false
exit
break
continue
shift
————————————————————————————————————————————————
shift 使位置参数向左移动,默认移动1位,可以使用shift 2
exit 退出整个程序
break 结束当前循环,或跳出本层循环
continue 忽略本次循环剩余的代码,直接进行下一次循环
2.continue/break/shift
--- 1.需求:通过循环脚本实现如下效果 ---
A123456789
B123456789
C123456789
D123456789
--- 2.编写循环脚本 ---
[root@localhost ~]
for i in {
A..D}
do
echo $i
for j in {
1..9}
do
echo $j
done
done
--- 3.测试脚本,观察结果 ---
[root@localhost ~]
A
1
2
3
4
5
6
7
8
9
B
......
--- 4.解决换行问题 ---
[root@localhost ~]
for i in {
A..D}
do
echo -n $i
for j in {
1..9}
do
echo -n $j
done
done
--- 5.测试脚本,观察结果 ---
[root@localhost ~]
A123456789B123456789C123456789D123456789
--- 6.外循环,添加一条空行语句 ---
[root@localhost ~]
for i in {
A..D}
do
echo -n $i
for j in {
1..9}
do
echo -n $j
done
echo
done
--- 7.测试,完成预期 ---
[root@localhost ~]
A123456789
B123456789
C123456789
D123456789
--- 8.总结:循环嵌套的规则是:外部循环一次,内部循环全部。 ---
--- 9.需求:跳出关于5的循环需求 ---
A12346789
B12346789
C12346789
D12346789
--- 10.continue ---
[root@localhost ~]
for i in {
A..D}
do
echo -n $i
for j in {
1..9}
do
if [ $j -eq 5 ];then
continue
fi
echo -n $j
done
echo
done
--- 11.break ---
[root@localhost ~]
for i in {
A..D}
do
echo -n $i
for j in {
1..9}
do
if [ $j -eq 5 ];then
break 2
fi
echo -n $j
done
echo
done
[root@localhost ~]
A1234
--- 12.shift ---
Ⅰ.for循环不定义循环范围,循环去参数作为循环范围
[root@localhost ~]
for i
do
let sum+=$i
done
echo "sum : $sum"
[root@localhost ~]
sum :
[root@localhost ~]
sum : 1
[root@localhost ~]
sum : 2
[root@localhost ~]
sum : 3
[root@localhost ~]
sum : 4
Ⅱ.使用while循环,发现停不下来
[root@localhost ~]
while [ $
do
let sum+=$1
echo $sum
done
echo "sum : $sum"
[root@localhost ~]
-根本停不下来。因为循环为真。-
Ⅲ.使用shift移动参数的命令,结果得以实现
[root@localhost ~]
while [ $
do
let sum+=$1
shift
done
echo "sum : $sum"
[root@localhost ~]
sum : 3
[root@localhost ~]
sum : 6
-shift 1使参数 左移1位,shift 2 左移2位-
Ⅳ.另一个,创建用户的案例
[root@localhost ~]
while [ $
do
useradd $1
echo "$1 is created"
shift
done
[root@localhost ~]
aa is created
bb is created