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