写点什么

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

作者:DS小龙哥
  • 2022 年 2 月 13 日
  • 本文字数:2543 字

    阅读完需:约 8 分钟

1. 知识点介绍

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

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

2. 数组的定义与使用

#!/bin/basharray=(12 34 5 6 78)array[0]=666array[2]=888printf "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=0for 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/bashstr="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" $*}
#定义一个函数,支持返回值#函数的返回值必须是整数,不能超过255func2(){ a=10 b=20 c=`expr $a + $b` return $c}
#调用函数funcfunc1 12 34 56 78func2 printf "函数返回值:%d\n" $?
复制代码

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

#!/bin/bash
#判断平年和闰年#get_year 2008get_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" $yearelse printf "%d 是平年.\n" $yearfi
复制代码

6. 打印水仙花数

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


#!/bin/bashcnt=100a=0b=0c=0#123  1 2while [ $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=100i=2while [ $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/bashprintf "请输入排序数据数量:"read cntprintf "请输入排序数据:"
i=0buff[0]=0while [ $i -lt $cnt ]do read buff[$i] i=`expr $i + 1`done
printf "排序之前的数据:%s\n" ${buff[*]}
i=0cnt=`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`doneprintf "排序之后的数据:%s\n" ${buff[*]}
复制代码

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

#!/bin/bashif [ $# -ne 1 ]then    printf "传入的参数错误.\n"    printf "正确传入参数格式: ./xxx.sh /work\n"    exitfi
#判断传入的参数是否是目录if [ -d $1 ]then printf "工作目录:%s\n" $1 cd $1 #切换到工作目录else printf "传入的参数不是目录.\n" printf "正确传入参数格式: ./xxx.sh /work\n" exitfi
max=0file_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 fidone
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/bashi=1while [ $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
复制代码


发布于: 11 小时前阅读数: 4
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Linux系统编程-Shell脚本基本使用(数组、函数、字符串处理)