Linux系统编程-Shell脚本基本使用(数组、函数、字符串处理)

简介: 前面文章介绍了Shell脚本的变量、运算符、条件语句、循环语句的使用,这篇文章接着介绍Shell脚本里数组、函数、字符串处理相关语法。 没有过多的理论介绍,每个知识点都配有一个例子程序,直接看例子程序理解。后面列出了一些练习题,结合前面的介绍的基本语法知识做一些练习,巩固Shell的基本语法使用。

1. 知识点介绍

前面文章介绍了Shell脚本的变量、运算符、条件语句、循环语句的使用,这篇文章接着介绍Shell脚本里数组、函数、字符串处理相关语法。 没有过多的理论介绍,每个知识点都配有一个例子程序,直接看例子程序理解。

后面列出了一些练习题,结合前面的介绍的基本语法知识做一些练习,巩固Shell的基本语法使用。

2. 数组的定义与使用

#!/bin/bash
array=(12 34 5 6 78)
array[0]=666
array[2]=888
printf "array[0]=%d\n" ${array[0]}
printf "array[1]=%d\n" ${array[1]}
printf "array[2]=%d\n" ${array[2]}
printf "array[3]=%d\n" ${array[3]}
printf "array[4]=%d\n" ${array[4]}

#打印数组全部元素的值---内部是使用for实现的
printf "array[*]=%d\n" ${array[*]}

#使用for循环取出数组里的全部值
cnt=0
for data in ${array[*]}
do
    printf "array[%d]=%d\n" $cnt $data
    cnt=`expr $cnt + 1`
done

printf "数组元素的个数:%d\n" ${#array[*]}
printf "数组下标4的数据长度:%d\n" ${#array[4]}

3. 字符串的提取和长度计算

#!/bin/bash
str="1234567890"
printf "str字符串的长度=%d\n" ${#str}

str1="abcd${str}/work/home/\"888\""
printf "str1=%s\n" $str1

str2="1234567890"
#提取子字符串
printf "提取的字符串1:%s\n" ${str2:2}
printf "提取的字符串2:%s\n" ${str2:2:3}

4. 函数的定义和使用

#!/bin/bash

#定义一个函数
func()
{
    printf "123456.\n"
}

#定义一个函数--支持形参的传递
func1()
{
    printf "函数的形参1=%d\n" $1
    printf "函数的形参2=%d\n" $2
    printf "函数的形参3=%d\n" $3  
    printf "函数的形参个数=%d\n" $#
    #printf "输出函数的所有形参=%s\n" $*
}

#定义一个函数,支持返回值
#函数的返回值必须是整数,不能超过255
func2()
{
    a=10
    b=20
    c=`expr $a + $b`
    return $c
}

#调用函数
func
func1 12 34 56 78
func2 
printf "函数返回值:%d\n" $?

5. 封装函数:判断平年和闰年

#!/bin/bash

#判断平年和闰年
#get_year 2008
get_year()
{
    if [ `expr $1 % 4` -eq 0 -a `expr $1 % 100` -ne 0 ] || [ `expr $1 % 400` -eq 0 ]
    then
        return 0  #表示闰年
    else 
        return 1  #平年
    fi
}

read -p "请输入一个年份:" year

#判断平年和闰年
get_year $year

if [ $? -eq 0 ]
then
    printf "%d 是闰年.\n" $year
else
    printf "%d 是平年.\n" $year
fi

6. 打印水仙花数

所谓水仙花是指一个三位数,其各位数字的立方和等于该数

#!/bin/bash
cnt=100
a=0
b=0
c=0
#123  1 2
while [ $cnt -lt 1000 ]
do
    #数位分离
    a=`expr $cnt / 100`
    b=`expr $cnt % 100 / 10`
    c=`expr $cnt % 10`
    #求和计算
    sum=`expr $a '*' $a '*' $a`
    sum=`expr $b '*' $b '*' $b + $sum`
    sum=`expr $c '*' $c '*' $c + $sum`
    if [ $sum -eq $cnt ]
    then
        printf "水仙花数:%d\n" $cnt
    fi
    cnt=`expr $cnt + 1`
done

7. 温度换算

输入一个华氏温度,输出摄氏温度,计算公式为 (华氏度-32)×5÷9 要求结果保留两位小数。

#!/bin/bash
#输入一个华氏温度,输出摄氏温度,计算公式为   (华氏度-32)×5÷9 要求结果保留两位小数。
echo "scale=2; ( 120.34 - 32 ) * 5 / 9 " | bc

8. 输出100~200之间的素数

#!/bin/bash
#输出100~200之间所有的素数
cnt=100
i=2
while [ $cnt -le 200 ]
do
    while [ $i -lt $cnt ]
    do
        if [ `expr $cnt % $i` == 0 ]
        then
            break
        fi
        i=`expr $i + 1`
    done
    if [ $i == $cnt ]
    then
        echo "$cnt "
    fi
    i=2
    cnt=`expr $cnt + 1`
done

9. 冒泡排序

冒泡排序: 从键盘上输入数据实现大-小 小-大排序。

#!/bin/bash
printf "请输入排序数据数量:"
read cnt
printf "请输入排序数据:"

i=0
buff[0]=0
while [ $i -lt $cnt ]
do
    read buff[$i]
    i=`expr $i + 1`
done

printf "排序之前的数据:%s\n" ${buff[*]}

i=0
cnt=`expr $cnt - 1`
while [ $i -lt $cnt ]
do
    j=0
    while [ $j -lt $cnt_j ]
    do
        if [ ${buff[$j]} -gt ${buff[`expr $j + 1`]} ]
        then
            tmp=${buff[$j]}
            buff[$j]=${buff[`expr $j + 1`]}
            buff[`expr $j + 1`]=$tmp
        fi
        j=`expr $j + 1`
    done
    i=`expr $i + 1`
done
printf "排序之后的数据:%s\n" ${buff[*]}

10. 查找指定目录下最大的文件

#!/bin/bash
if [ $# -ne 1 ]
then
    printf "传入的参数错误.\n"
    printf "正确传入参数格式: ./xxx.sh /work\n"
    exit
fi

#判断传入的参数是否是目录
if [ -d $1 ]
then
    printf "工作目录:%s\n" $1
    cd $1   #切换到工作目录
else
    printf "传入的参数不是目录.\n"
    printf "正确传入参数格式: ./xxx.sh /work\n"
    exit
fi

max=0
file_name=""
#扫描目录
for file in *
do
    #判断是否是文件
    if [ -f $file ]
    then
        str=`du $file -b`
        
        len=${#str}  #字符串总长度
        cnt=0
        while [ $cnt -lt $len ]
        do
            if [ -z ${str:$cnt:1} ]
            then
                break 1
            fi
            cnt=`expr $cnt + 1`
        done
        file_size=${str:0:${cnt}}
        printf "%s的文件大小:%d byte\n" $file $file_size
        if [ $max -lt $file_size ]
        then
            max=$file_size
            file_name=$file
        fi
    fi
done

printf "%s目录下最大的文件是:%s ,大小:%d Byte\n" $1 $file_name $max

11. 检测局域网在线用户

写一个脚本, 通过ping命令测试192.168.x.0到192.168.x.254之间的所有主机是否在线

   如果在线,就显示“在线”
   如果不在线,就显示“离线”

注意:ping -c1 -w1 中-c1是指ping的次数,-w是指执行的最后期限,也就是执行的时间,单位为秒

#!/bin/bash
i=1
while [ $i -lt 256 ]
do
    ping -c1 -w1 "192.168.2.${i}" >/dev/null
    if [ $? -eq 0 ]
    then
        printf "%s 地址在线.\n" "192.168.2.${i}"
    fi
    i=`expr $i + 1`
done
目录
相关文章
|
21天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
158 78
|
11天前
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
53 19
|
25天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
56 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
13天前
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
45 18
|
21天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
89 13
|
2月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
49 0
Linux 如何更改默认 Shell
|
21天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
40 0
|
1月前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
154 8
|
2月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
616 6