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

网友投稿 783 2022-05-29

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" printf "函数的形参2=%d\n" printf "函数的形参3=%d\n" 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 % 4` -eq 0 -a `expr % 100` -ne 0 ] || [ `expr % 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. 冒泡排序

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

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

#!/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

linux Shell 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《网络攻防技术(第2版)》 —3.2.3 Windows系统远程口令猜解
下一篇:hadoop基本认识
相关文章