shell脚本经典题之函数应用

shell脚本经典题之函数应用

1、函数的概述:

(1) 函数的定义:

和其他“真正”的编程语言一样,如:Java,C语言,Python等,Bash也有函数,尽管它在实现方面有一些限制。

一个函数就是一个子程序,实现一些列操作的代码块,执行一个特定任务的“黑盒子”。

函数的格式:

function function_name {

command . . .

}

或者

function_name ( ) {

command. . .

}

(2) 函数的使用:
#!/bin/bash
demoFun(){
  echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

在这里插入图片描述

注意:

(1)函数定义必须在第一次调用之前。

(2)函数同名时,调用函数则是调用后一个函数

(3)调用函数与函数的定义顺序无关

#!/bin/bash
hh(){
w;h
}
h(){
echo "hello"
}

w(){
echo "world"
}

nihao(){
echo `w` `h`
}
h;w
nihao
hh

在这里插入图片描述

(3) 函数的返回值:

函数返回一个值,被称为退出状态码。这和一条命令返回的退出状态码 类似。

退出状态码可以由return 命令明确指定,也可以由函数中最后 一条命令的退出状态码来指定(如果成功,则返回0,否则返回非0 值)。

可以在脚本中使用 $? 来引用退出状态码。

#!/bin/bash
user(){
if [ $USER=root ]
then
echo "你是管理员用户"
else
echo "你不是管理员用户"
return 1
fi
}

user

在这里插入图片描述

(4) 函数的参数:

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

#!/bin/bash
#函数的参数例题

sum(){
echo "第一个数:" $1
echo "第二个数:" $2

let n=$1+$2
echo $n
}

sum $1 $2

在这里插入图片描述

2、shell函数例题–阶乘计算:

#这有两种方法:
#第一种是利用 for 循环来阶乘计算

#!/bin/bash
sum=1
read -p "请输入你想要的数,使其阶乘:" n
for(( i=2;i<=$n;i++ ))
do
sum=$[i * sum]
done
echo "1到 $n 的阶乘为:$sum"

#第二种方法是函数调用自身,利用位置变量来传参
fact(){
if [ $1 -eq 0 -o $1 -eq 1 ]
#如果$1 等于0或者1,等于1
then
echo 1
else
echo $[$1 * $(fact $[$1-1])]
#阶乘 $1=$1x($1-1 的阶乘)
fi
}
fact $1

在这里插入图片描述

3、shell函数–冒泡排序:

#!/bin/bash
#根据你想排序的位数,随机输入自己想要冒泡排序的数字:

arr=()
read -p "请输入你想输入的位数:" p
for (( n=1;n<=$p;n++ ))
do
read -p  "请输入第 $n 个数字:" t
arr[n-1]=$t
done

echo "----对数字 ${arr[*]} 进行冒泡排序----"
echo
for (( j=1;j<${#arr[*]};j++ ))
do
  flag=1
  for (( i=0;i<${#arr[*]}-j;i++ ))
  do
  if [ ${arr[i]} -gt ${arr[i+1]} ]
  then
  tmp=${arr[i]}
  arr[i]=${arr[i+1]}
  arr[i+1]=$tmp
  flag=0
  fi
  done
  if [ $flag -eq 1 ]
  then
  echo "经过 $j 轮比较,冒泡排序完成。"
  break
  fi
done
echo
echo " $p 个数冒泡排序后的顺序为:${arr[*]}"
echo

在这里插入图片描述

4、shell函数–菜单合集:

在这里插入图片描述

#!/bin/bash
#shell函数应用--菜单合集

fire(){
echo "---关闭防火墙---"
systemctl disable firewalld
}

systemInfo(){
echo "系统信息:"
name=`hostname`
ip=`ifconfig ens33|awk /netmask/'{print $2}'`
os=`cat /etc/redhat-release`
kernel=`uname -r`
cpu=`lscpu|grep 型号名称:|tr -s " "|cut -d" " -f1 --complement`
mem=`free -hm | awk /Mem/'{print $2}'`
space=`lsblk | awk /disk/'{print $4}'|awk -F G '{print $1}'`
#这里是设置输出时的字体颜色
G="\e[1;32m"
B="\e[1;34m"
E="\e[0m"

for i in $space
  do let sum=$[$sum+$i]
done

echo -e "$B主机名:$E$G\t$name\t$E"
echo -e "${B}IP地址:$E$G\t$ip\t$E"
echo -e "$B系统版本:$E$G\t$os\t$E"
echo -e "$B内核版本:$E$G\t$kernel\t$E"
echo -e "${B}cpu名称:$E$G\t$cpu\t$E" 
echo -e "$B内存总大小$E:$G\t$mem\t$E"
echo -e "$B硬盘总大小$E:$G\t${sum}G\t$E"
}

yumadd(){
cd /etc/yum.repos.d
mkdir bak
mv *.repo bak/

echo "[abc]
name=abc
baseurl=file:///mnt
enable=1
gpgcheck=0" > abc.repo

mount /dev/sr0 /mnt
yum clean all
yum install tree -y
}

diskadd(){
lsblk
fdisk /dev/sdb <<EOF
m
n
p


+10G
p
w
EOF

lsblk
mkfs.xfs /dev/sdb1
if [ -e /tp ]; then
exit
fi
mkdir /tp
echo "/dev/sdb1  /tp  xfs  defaults  0 0" >> /etc/fstab
mount -a
df -hT
}

jiance(){
if [ $USER == "root" ]
then
echo "你是root用户"
else
echo "你不是root用户"
fi
}

biem(){
read -p "请输入你要定义的别名:" bakname
echo "$bakname" >> /etc/bashrc
#shopt -s expand_aliases
#source /etc/bashrc
}

changeName(){
echo "修改主机名要重启电脑才有效"
hostnamectl set-hostname swl
init 6
}

sshSet(){
#!/usr/bin/expect
set timeout 5

set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {
  "拒绝连接" exit
  "服务名称未知" exit
  "continue" {send "yes\r";exp_continue}
  "password:" {send "$password\r"}
}
interact
exit

}

PS3="请选择项目(1-9):"
menu="
关闭防火墙
显示系统信息
搭建yum仓库
磁盘自动分区
检测当前用户
添加别名
更改主机名
使用ssh免密登录
退出菜单
"

select menu in $menu
do
case $REPLY in
1)
fire
;;

2)
systemInfo
;;

3)
yumadd
;;

4)
diskadd
;;

5)
jiance
;;

6)
shopt -s expand_aliases
#shopt expand_aliases
biem
source /etc/bashrc
;;

7)
changeName
;;

8)
sshSet
;;

9)
echo "退出菜单"
break
;;

*)
echo "选择错误,请重新选择(1-9):"
esac
done

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

shell是一门脚本语言,像Java,Python一样,要知道基本机构和语法,函数的使用等,最重要的是多敲,不然光靠看是需要漫长的岁月的,多敲命令,多大代码才是王道!
在这里插入图片描述

  • 37
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值