函数与数组

简介: 函数(function),数学术语。其定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。

目录


函数 function


概念


定义函数


函数定义格式:


案例1:定义函数并通过函数名直接调用执行


案例2:函数的传参,位置变量


案例3:函数的传参,变量传递固定值


案例4:函数的传参,变量传递可变值


案例5:多值传参


案例6:多值传参计算


案例7:函数状态返回值echo、return


案例8:函数return返回值


案例9:输入的数值判断并返回相应值


案例10:列出系统所有用户


案例11:函数库调用


案例12:定义程序是否运行


数组


概念


创建格式


存数据


取数据


脚本取数据


增删改查



函数 function

概念

函数(function),数学术语。其定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。

定义函数

   命令的集合,用来完成特定的功能;                #功能

   提前定义函数,在脚本中任意调用函数名。        #任意调用

   使用函数使代码模块化,便于重复使用,增加可读性。        #重复调用,减少代码量

函数定义格式:

1. 函数名(){
2.     shell命令
3. }
4.     
5. 或
6. 
7. function 函数名 {
8.     shell命令
9. }

案例1:定义函数并通过函数名直接调用执行

1. vim fun1.sh
2. #!/bin/bash
3. fun1(){
4.     echo "这是第一种定义函数的方法"
5. }
6. 
7. function fun2 {
8.     echo "这是第二种定义函数的方法"
9. }
10. 
11. fun1
12. fun2

案例2:函数的传参,位置变量

1. vim fun2.sh
2. #!/bin/bash
3. fun1(){
4.     echo "hello $1"
5. }
6. 
7. function fun2 {
8.     echo "hello $*"
9. }
10. 
11. fun1 $1
12. fun2 $*

案例3:函数的传参,变量传递固定值

1. vim fun3.sh
2. #!/bin/bash
3. fun1(){
4.     echo "$i"
5. }
6. i=100
7. fun1

案例4:函数的传参,变量传递可变值

1. vim fun4.sh
2. #!/bin/bash
3. fun1(){
4.     echo "$i"
5. }
6. i=$1
7. fun1

案例5:多值传参

vim fun5.sh
#!/bin/bash
fun1(){
    echo "$1"
}
fun1 $1
fun1 $2
fun1 $3
vim fun5.sh
#!/bin/bash
fun1(){
    echo "$1" "$2" "$3"
}
fun1 $1 $2 $3
zh=$(fun1 $1 $2 $3)
echo "传参的值:$zh"


案例6:多值传参计算

vim fun6.sh
#!/bin/bash
fun1(){
    case $2 in
        +)
            echo $1 + $3 = $(( $1 + $3 ))
            ;;
        -)
            echo $1 - $3 = $(( $1 - $3 ))
            ;;
        x)
            echo $1 \* $3 = $(( $1 * $3 ))
            ;;
        /)
            echo $1 / $3 = $(( $1 / $3 ))
            ;;
    esac
}
fun1 $1 $2 $3

案例7:函数状态返回值echo、return

echo可以返回任何字符串结果,用于返回数据;

return只能返回1-255的整数值,通常用来表示状态:0成功、1失败


vim fun7.sh
#!/bin/bash
fun1(){
    echo 100
    return 1
}
result=$(fun1)
echo "函数的状态码是:$?"
echo "函数的返回值是:$result"
案例8:函数return返回值
vim fun8-1.sh
#!/bin/bash
file=/etc/passwd
fun1(){
    if [ -f $file ];then
        return 0
    else
        return 1
    fi
}
fun1
if [ $? -eq 0 ];then
    echo "$file 文件存在"
else
    echo "$file 文件不存在"
fi

案例9:输入的数值判断并返回相应值

要求:0-10返回0,10-20返回1,20-30返回2,其他返回3.


vim fun9.sh
#!/bin/bash
num(){
    read -p "请输入对应的数字:" sz
    if [ $sz -ge 0 -a $sz -lt 10 ];then
        return 0
    elif [ $sz -ge 10 -a $sz -lt 20 ];then
        return 1
    elif [ $sz -ge 20 -a $sz -lt 30 ];then
        return 2
    else    
        return 3
    fi
}
num
echo $?
vim fun8-2.sh
#!/bin/bash
pid=$$
nginx_run(){
    ps -ef |grep nginx |grep -v grep |grep -v $pid &> /dev/null
    if [ $? -eq 0 ];then
        return 0
    else
        return 1
    fi
}
nginx_run && echo "nginx is running" || echo "nginx is stopped"

案例10:列出系统所有用户

vim fun10.sh
#!/bin/bash
function get_users
{
    users=`cat /etc/passwd | cut -d: -f1`
    echo $users
}
user_list=`get_users`
i=1
for u in $user_list
do
    echo "The $i user is : $u"
    let i++
done


案例11:函数库调用

vim /root/base_function
function add
{
    echo "`expr $1 + $2`"
}
function reduce
{
    echo "`expr $1 - $2`"
}
function multiple
{
    echo "`expr $1 \* $2`"
}
function divide
{
    echo "`expr $1 / $2`"
}
function sys_load
{
    echo "cpu load"
    echo 
    sar -u
    echo 
    echo "memory info"
    echo 
    sar -r
    echo 
    echo "disk usage"
    echo
    sar -B
    echo 
}
vim fun11.sh
#!/bin/bash
. /root/base_function
add 10 20
reduce 90 30
multiple 12 12
divide 12 2
sys_load


案例12:定义程序是否运行

#!/bin/bash
pid=$$
fun(){
        ps -ef |grep nginx |grep -v grep |grep -v ${pid} &> /dev/null
        if [ $? -eq 0 ];then
                return 0
        else
                return 1
        fi
}
fun
if [ $? -eq 0 ];then
        echo "nignx 已运行!"
else
        echo "nignx 已关闭!"
fi

数组

概念

可以看成变量,变量一般只能存储一个值,数组可以存储多个值。

创建格式

存数据

names=( zhangsan lisi wangwu zhaoliu)


names[0]=huangting


read -a ages-p "请输入年龄:"         #有提示信息定义方法



以整个数组长度为下表


names[${#names[@]}]=sisi         ##往最后一行增加数据


取数据

echo ${names[0-n]}


echo ${names[@]}         ##查看诉诸里的所有数据


echo ${names[*]}


echo ${#names[@]}         ##统计所有数据的个数


echo ${!names[@]}         ##获取数组中所有元数的索引下标

脚本取数据

1. #!/bin/bash
2. names=(zhangsan lisi chenwu zhaoliu)
3. for ((i=0;i<4;i++))
4. do
5. echo ${names[i]}
6. 
7. done

增删改查

#!/bin/bash
names=(zhangsan lisi chenwu zhaoliu)
index=-1
list(){
        for ((i=0;i<${#names[@]};i++))
        do
                echo ${names[i]}
        done
}
find(){
        read -p "请输入姓名:" name
        for((i=0;i<${#names[@]};i++))
        do
                if [ ${names[$i]} == ${name} ];then
                        index=${i}
                        break
                fi
        done
        echo ${index}
}
add(){
read -p "请输入用户名:" name
names[${#names[@]}]=${name}
echo "用户${name}已经添加成功!新的列表为:"
list
}
chage(){
        i=$(find)
        read -p "请输入新的名字:" new
        names[$i]=${new}
        echo "修改成功,修改后如下:"
        list
}
del(){
        i=$(find)
        names[$i]=
        echo "删除成功,修改后菜单如下:"
        list
}
while true
do
cat << END
欢迎使用本系统
1.添加用户
2.查找用户
3.修改用户
4.删除用户
5.退出系统
END
read -p "请选择操作:" n
case $n in
        1)
                list
                add
                ;;
        2)
                i=$(find)
                if [ ${i} -ne -1 ];then
                        echo "用户已找到"
                else
                        echo "用户未找到"
                fi
                ;;
        3)
                list
                chage
                ;;
        4)
                list
                del
                ;;
        5)
                echo "感谢使用"
                exit
                ;;
        *)
                echo "请输入正确选项 "
                exit
                ;;
esac
done



相关文章
AutoJS4.1.0实战教程 ---百度极速版
AutoJS4.1.0实战教程 ---百度极速版
295 0
|
3月前
|
分布式计算 Java 大数据
Java 大视界 —— 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
本文围绕基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用展开,剖析行业现状与挑战,阐释技术原理,介绍其在数据处理及天气预报中的具体应用,并结合实际案例展示实施效果。
|
6月前
|
存储 网络性能优化 网络安全
Hyper-V云桌面优化的设置指南
这份《Hyper-V云桌面优化设置指南》涵盖了硬件、虚拟机配置、网络、安全及高级配置的优化建议。硬件方面,确保CPU支持虚拟化并合理分配资源,使用SSD和VHDX格式提升存储性能;虚拟机配置上,优化内存、处理器和硬盘设置,并安装Hyper-V集成服务;网络优化包括虚拟交换机配置、适配器调整及QoS策略;安全性设置涵盖防火墙、端口管理和加密;高级配置如显卡直连和实时迁移进一步提升性能。这些措施能显著提高Hyper-V云桌面的效率与稳定性。
|
分布式计算 Hadoop 大数据
Jupyter 在大数据分析中的角色
【8月更文第29天】Jupyter Notebook 提供了一个交互式的开发环境,它不仅适用于 Python 编程语言,还能够支持其他语言,包括 Scala 和 R 等。这种多语言的支持使得 Jupyter 成为大数据分析领域中非常有价值的工具,特别是在与 Apache Spark 和 Hadoop 等大数据框架集成方面。本文将探讨 Jupyter 如何支持这些大数据框架进行高效的数据处理和分析,并提供具体的代码示例。
310 0
|
SQL 关系型数据库 MySQL
sql数据库同步软件
SQL数据库同步软件有多种选择,以下是一些常见的工具: * SQL Data Compare:此工具可以帮助在SQL Server或Azure SQL数据库之间进行数据比较和同步。它能够自动检测
|
9月前
|
Kubernetes 安全 数据安全/隐私保护
云卓越架构:容器安全最佳实践
本次分享由阿里云智能集团解决方案架构师张玉峰主讲,主题为“云卓越架构:容器安全最佳实践”。内容涵盖容器安全的挑战、云原生容器安全架构及典型场景。首先分析了容器安全面临的问题,如镜像漏洞和权限管理。接着介绍了容器安全架构的五个维度:身份权限管理、配置安全检查、运行时防护、镜像安全检测及发布的安全管控。最后通过具体场景展示了容器身份与权限管理、密钥管理、运行时防入侵等最佳实践,强调了安全左移的重要性,确保从开发到运行的全生命周期安全覆盖。
|
监控 安全 Linux
【专栏】Linux中六个常用的网络命令:ping、traceroute、netstat、nmap、ifconfig和ip
【4月更文挑战第28天】本文介绍了Linux中六个常用的网络命令:ping、traceroute、netstat、nmap、ifconfig和ip,以及它们在测试网络连通性、追踪路由、查看网络状态、安全扫描和接口配置等场景的应用。通过学习和运用这些命令,系统管理员和网络爱好者能更有效地诊断和管理网络问题,确保网络稳定运行。
880 0
|
12月前
|
前端开发 JavaScript
前端基础(十三)_定时器(间歇定时器、延迟定时器)
本文介绍了JavaScript中定时器的使用,包括`setTimeout`和`setInterval`两种类型。`setTimeout`是实现延迟执行,即等待一定时间后执行一次指定的函数;而`setInterval`是实现间歇执行,即每隔一定时间就执行一次指定的函数。文章还介绍了如何使用`clearTimeout`和`clearInterval`来取消定时器的执行,并通过示例代码展示了定时器的创建和取消。
479 4
前端基础(十三)_定时器(间歇定时器、延迟定时器)
|
11月前
|
Web App开发 Ubuntu 前端开发
【踩坑记】Ubuntu 20.04.6 LTS下编译安装gcc 4.4.0
【踩坑记】Ubuntu 20.04.6 LTS下编译安装gcc 4.4.0
|
11月前
|
NoSQL Shell MongoDB
MongoDB Shell
10月更文挑战第11天
156 0