目录
shell函数与数组
shell函数
函数定义
- 将命令序列按格式写在一起
- 可方便重复使用命令序列
shell函数定义
- 使用函数可以将大模块分割成小模块
函数的组成:函数名、函数体
[root@localhost ~]#help function #函数帮助
函数定义:
function 函数名{
命令序列
}
函数名(){
命令序列
}
function 函数名(){
命令序列
}
[root@localhost ~]#test () { ls; cd /opt; }
[root@localhost ~]#test
anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost opt]#
调用函数的方法
[root@localhost ~]#vim test.sh
#!/bin/bash
os () {
if grep -qi 'centos' /etc/os-release
then
echo "centos"
elif grep -qi 'ubuntu' /etc/os-release
then
echo "ubuntu"
else
echo "this system not support"
fi
}
os
if [ `os` = centos ]
then
yum install httpd -y
elif [ `os` = ubuntu ]
then
apt install apache2 -y
else
echo "不支持"
fi
[root@localhost ~]#bash test.sh
centos
已加载插件:fastestmirror, langpacks
base
正在安装 : httpd-2.4.6-99.el7.centos.1.x86_64 3/3
验证中 : httpd-2.4.6-99.el7.centos.1.x86_64 1/3
验证中 : mailcap-2.1.41-2.el7.noarch 2/3
验证中 : httpd-tools-2.4.6-99.el7.centos.1.x86_64 3/3
已安装:
httpd.x86_64 0:2.4.6-99.el7.centos.1
作为依赖被安装:
httpd-tools.x86_64 0:2.4.6-99.el7.centos.1 mailcap.noarch 0:2.1.41-2.el7
完毕!
[root@localhost ~]#scp test.sh 192.168.8.106:/opt/
[root@localhost ~]#vim hello.sh
#!/bin/bash
h () {
echo "hello"
}
nihao () {
echo `h` `w`
}
w () {
echo "world"
}
nihao
[root@localhost ~]#bash hello.sh
hello world
[root@localhost ~]#bash -x hello.sh
+ nihao
++ h
++ echo hello
++ w
++ echo world
+ echo hello world
hello world
[root@localhost ~]#vim sum.sh
#!/bin/bash
sum (){
echo $1
echo $2
echo $3
}
sum $2 $3 $1
#外面脚本的位置变量
[root@localhost ~]#cat sum.sh
#!/bin/bash
sum (){
echo $1
echo $2
echo $3
}
sum $2 $3 $1
[root@localhost ~]#bash sum.sh a b c
b
c
a
[root@localhost data]#name=lj
[root@localhost data]#test () { name=tu; }
[root@localhost data]#echo $name
lj
[root@localhost data]#test
[root@localhost data]#echo $name
tu
[root@localhost data]#vim com.sh
#!/bin/bash
read -p "请输入你要计算的阶乘数值(正整数)" num
sum=1
for i in `seq $num`
do
sum=$[ i*sum ]
done
echo $sum
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)5
120
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)4
24
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)3
6
函数递归
函数调用自己本身的函数
阶乘
[root@localhost data]#cat fact.sh
#!/bin/bash
#求5的阶乘,需要5-1=4 (1*2*3*4)*5
fact () {
read -p "请输入要求的阶乘:" num
if [ $num -eq 0 -o $num -eq 1 ]
then
echo 1
else
temp=$[$num-1]
#求前一个数
result= $(fact $temp)
#求前一个数阶乘结果
echo $[ $num * $result ]
#求现在的数的阶乘
fi
}
fact $num
题目
1.DNS作用是实现IP地址和主机名(域名)之间的映射,Linux系统 文件定义了DNS的Nameserver
/etc/resolv.conf
2.结束后台进程的命令是
kill
3.为脚本指定执行权的命令及参数是
chmod +x
4.欲发送10个分组报文测试与主机 www.aliyun.com 的连通性,应使用的命令和参数是
ping -c 10
5.使用命令 (当前目录)config_(要求完整命令) 对 config 目录做归档压缩,生成 config.tar.gz 文件
tar zcvf ./config config.tar.gz
6.Linux系统中,使用命令(非ping)测试DNS服务器是否能够正确解析域名。
host
dig
nslookup
7.当局域网没有条件建立DNS服务器,但又想让局域网内的用户可以使用计算机名互相访问,应配置文件
/etc/hosts
8.永久改变主机名
hostnamectl set-hostname 名字
9.查看 10.0.0.1 机器上提供的网络文件 NFS 服务
showmount -e 10.0.0.1
10使用LVM 进行磁盘分区挂载
mount
11.LVM相关命令有哪些
pvcreate
vgcreate
lvcreate
pvdisplay
vgdisplay
lvdisplay
pvscan
vgscan
lvscan
pvextend
vgextend
lvextend
pvremove
vgremove
lvremove
12.某文件的权限为:drw-r--r--,用数值形式表示该权限为: 644
该文件属性是:目录
可读不可写不可执行:属组和其他
13.某系统网卡名为eth0,在文件中配置静态网络 (包括ip、掩码、网关等)
shell数组
- 变量:存储单个元素的内存空间
- 数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组定义方法
1.数组名=(value0 value1 value2…)
2.数组名=([0]=value [1]=value [2]=value…)
3.列表名=“value0 value1 value2…”
数组名=($列表名)
4.数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
[root@localhost ~]#a={10,20,30,40,50}
[root@localhost ~]#echo $a
{10,20,30,40,50}
[root@localhost ~]#a=(10,20,30,40,50)
[root@localhost ~]#echo $a
10,20,30,40,50
[root@localhost ~]#a=(10 20 30 40 50)
[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[*]}
10 20 30 40 50
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${#a[@]}
5
[root@localhost ~]#b=([0]=apple [1]=grape [2]=orange [3]=strawberry [4]=banana)
[root@localhost ~]#echo $b
apple
[root@localhost ~]#echo ${b[*]}
apple grape orange strawberry banana
[root@localhost ~]#c="10 20 30 40 50"
[root@localhost ~]#d=$c
[root@localhost ~]#echo ${d[*]}
10 20 30 40 50
[root@localhost ~]#echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]#echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#for i in ${b[@]};do echo $i;done;
apple
grape
orange
strawberry
banana
- 普通数组可以不事先声明,直接使用
基本数组
[root@localhost ~]#vim num.sh
#!/bin/bash
a=(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss ttt uuu vvv www xxx yyy zzz)
j=`echo $[RANDOM%6]`
n=$[j+1]
echo "选中的人是$n"
echo ${a[$j]}
[root@localhost ~]#bash num.sh
选中的人是5
eee
- 关联数组必须先声明,再使用
关联数组
[root@localhost ~]#declare -A f #声明关联数组
[root@localhost ~]#f[name]=tss
[root@localhost ~]#f[address]=China
[root@localhost ~]#echo ${f[name]}
tss
[root@localhost ~]#echo ${f[address]}
China
[root@localhost ~]#declare -a #查看数组
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -ar BASH_REMATCH='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="1")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
declare -a b='([0]="apple" [1]="grape" [2]="orange" [3]="strawberry" [4]="banana")'
冒泡排序
[root@localhost ~]#vim mp.sh
#!/bin/bash
a=( 10 30 50 70 133 )
#取出上面的数组的最大值
max=${a[0]}
l=${#a[@]}
for ((i=0;i<=l;i++))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done
echo $max
[root@localhost ~]#bash mp.sh
133
#求最小值
[root@localhost ~]#vim min.sh
#!/bin/bash
read -p "请输入数组以空格隔开" num
a=($num)
min=${a[0]}
l=${#a[@]}
for ((i=0;i<$l-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo "最小值是$min"
[root@localhost ~]#bash min.sh
请输入数组以空格隔开 4 2 5 6 3
最小值是2