第十六周-day68—Shell编程day05

第十六周-day68-shell编程day05

第十六周-day68—Shell编程day05_第1张图片

1.for循环语句

第十六周-day68—Shell编程day05_第2张图片

随机生成数字的一种方法

第十六周-day68—Shell编程day05_第3张图片

练习


第十六周-day68—Shell编程day05_第4张图片

1.for循环在/root下创建10个html文件,其中每个文件需要包含10个随机小写字母和数字,加固定字符串oldchang。名称示例如:apns1yrmk_oldchang.html。
[root@shell day05]# cat for1.sh 
#!/bin/bash
suffix="_oldchang.html"
for ((i=0; i<=10 ; i++)) ;do
   touch /server/scripts/day05/file/`date +%N|md5sum|cut -c 1-10`$suffix
done
[root@shell day05]# sh for1.sh 
[root@shell day05]# ll file/
total 0
-rw-r--r-- 1 root root 0 Jul 20 16:31 06d7415c18_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 22b6007222_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 232d120f98_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 24eb9ca27b_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 2dfb5d3996_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 6e92c961d6_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 9d73e8c661_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 9ee2ff767a_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 a94de61b66_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 ba09e7529c_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:31 dbd4cadf0c_oldchang.html
2.使用for循环,将上面文件名中的oldchang改为oldduan,并将扩展名全部大写
[root@shell day05]# cat for2.sh 
#!/bin/bash
for file in `ls file/`;do 
   mv $file ${file/oldchang.html/oldduan.HTML} &>/dev/null
done
[root@shell day05]# ll file/
total 0
-rw-r--r-- 1 root root 0 Jul 20 16:38 0cc1a6f122_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 0fcfd82665_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 2926da6325_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 35983a7e16_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 570c22fd5c_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 5b9c3e9607_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 5f101577d3_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 93c3445bff_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 c2bc523968_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 e148e11a25_oldchang.html
-rw-r--r-- 1 root root 0 Jul 20 16:38 fa9c74b056_oldchang.html

其他方法思路

第十六周-day68—Shell编程day05_第5张图片

3、使用for循环和if,筛选出以下单词中字符数大于等于6的单词:I am teacher oldchang and I like eating and sleeping

[root@shell day05]# cat for-ip.sh 
#!/bin/bash
for ((i=1;i<255;i++));do
    
    ping -c 1 -w 1 10.0.0.$i &>/dev/null
    if [ $? -eq 0 ];then
         echo "10.0.0.$i 可以ping通!"
     else
         echo "10.0.0.$i 不可以ping通!"
     fi
 done
 wait
[root@shell day05]# sh for-ip.sh 
10.0.0.1 可以ping通!
10.0.0.21 可以ping通!
^Z
[4]+  Stopped                 sh for-ip.sh
4、for循环打印99乘法表
[root@shell lianxi]# cat for99-1.sh 
#!/bin/bash
#倒三角排序
for ((i=9  ;i>=1;i--));do
   for ((j=1;j<=i;j++));do
       echo -en "${j}x$i=$(($i*$j))\t"    #第一种方法计算
   done
   echo
done
#正三角排序
for ((i=1;i<=9;i++));do
   for ((j=1;j<=i;j++));do
       echo -en "${j}x$i=`expr $i*$j|bc`\t"   #第二种方法计算
   done
   echo                                            
done
[root@shell lianxi]# sh for99-1.sh
1x9=9  2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81  
1x8=8  2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64  
1x7=7  2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49  
1x6=6  2x6=12  3x6=18  4x6=24  5x6=30  6x6=36  
1x5=5  2x5=10  3x5=15  4x5=20  5x5=25  
1x4=4  2x4=8   3x4=12  4x4=16  
1x3=3  2x3=6   3x3=9   
1x2=2  2x2=4   
1x1=1  
1x1=1  
1x2=2  2x2=4   
1x3=3  2x3=6   3x3=9   
1x4=4  2x4=8   3x4=12  4x4=16  
1x5=5  2x5=10  3x5=15  4x5=20  5x5=25  
1x6=6  2x6=12  3x6=18  4x6=24  5x6=30  6x6=36  
1x7=7  2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49  
1x8=8  2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64  
1x9=9  2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81  
第十六周-day68—Shell编程day05_第6张图片

5.给出一个网段,如10.0.0.0/24,如何判断网段内的所有ip是否能联通

[root@shell day05]# cat for-ip.sh 
#!/bin/bash
##############################################################
# File Name: for_ip.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
#for i in 10.0.0.{1..254}
#do
#    ping -c 2 -w 2 $i &>/dev/null
#    if [ $? -eq 0 ];then
#        echo $i 可以ping通! 
#    else
#        echo $i 不可以ping通  &>/dev/null
#    fi
#done
for ((i=1;i<255;i++));do
    
    ping -c 1 -w 1 10.0.0.$i &>/dev/null
    if [ $? -eq 0 ];then
         echo "10.0.0.$i 可以ping通!"
     else
         echo "10.0.0.$i 不可以ping通!"
     fi
 done
 wait
[root@shell day05]# sh for-ip.sh 
10.0.0.1 可以ping通!
10.0.0.21 可以ping通!
^Z
[4]+  Stopped                 sh for-ip.sh
第十六周-day68—Shell编程day05_第7张图片

2.循环的流程控制

break、continue、exit、return

第十六周-day68—Shell编程day05_第8张图片

2.1 break

[root@shell day05]# vim break.sh
  1 #!/bin/bash
  2 ##############################################################
  3 # File Name: break.sh
  4 # Version: V1.0
  5 # Author: lcx
  6 # Organization: www.oldboyedu.com
  7 ##############################################################
  8 for ((i=0;i<10;i++));do
  9     echo $i
 10     if [ $i -eq 3 ];then
 11         break                                                                         
 12     fi
 13 done
[root@shell day05]# sh break.sh
0
1
2
3

2.2 contunue

[root@shell day05]# cat break.sh 
#!/bin/bash
##############################################################
# File Name: break.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
for ((i=0;i<10;i++));do
    echo $i
    if [ $i -eq 3 ];then
        continue
    fi
done
echo "hello"
[root@shell day05]# sh break.sh 
0
1
2
3
4
5
6
7
8
9
hello

流程控制的测试脚本

第十六周-day68—Shell编程day05_第9张图片
[root@shell day05]# vim for-bcer.sh
#!/bin/bash
##############################################################
# File Name: for-bcer.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
#############################################################
#循环流程控制break、continue、exit、return的区别和对比
if [ $# -ne 1 ];then
    # 如果传参个数部位1,则打印下面的使用提示,提示四个命令作为参数
    echo $"usage:$0 {break|continue|exit|return}"
    exit 1  #退出脚本
fi
function test(){
    for((i=0;i<5;i++));do
        if [ $i -eq 3 ];then
            $*; #"$*" 就是接收函数以外的参数,是{break|continue|exit|return}其中一个
        fi  
        echo $i
    done
    echo "I am in func." #函数内循环外的输出提示
}
test $* # 这里的$*为参数的传参
func_ret=$? # 接收并测试函数返回值
if [ `echo $*|grep return|wc -l` -eq 1 ];then # 如果传参中含有return
    echo "return exit status: $func_ret" # 则提示return退出的状态码
fi
echo "OK" 

执行结果

[root@shell day05]# sh for-bcer.sh
usage:for-bcer.sh {break|continue|exit|return}
[root@shell day05]# sh for-bcer.sh break
0
1
2
I am in func.
OK
[root@shell day05]# sh for-bcer.sh continue
0
1
2
4
I am in func.
OK
[root@shell day05]# sh for-bcer.sh exit
0
1
2
[root@shell day05]# sh for-bcer.sh return
0
1
2
return exit status: 0
OK
第十六周-day68—Shell编程day05_第10张图片

3. 数组

普通数组:只能使用整数作为索引
关联数组:可以只用字符串作为数组索引

3.1 普通数组

[root@shell day05]# oldboy[2]=lcx
[root@shell day05]# oldboy[3]=gyj
[root@shell day05]# oldboy[4]=wx
[root@shell day05]# declare -a  #查看数组
[root@shell day05]# echo $oldboy
ljg
[root@shell day05]# echo ${oldboy[3]}
gyj
[root@shell day05]# echo ${oldboy[4]}
wx
[root@shell day05]# echo ${oldboy[@]}   #"@"和"*"相同
ljg wd lcx gyj wx gds lfx hyj rh
[root@shell day05]# echo ${oldboy[*]}
ljg wd lcx gyj wx gds lfx hyj rh
[root@shell day05]# echo ${!oldboy[*]}  #查看数组所有的索引下标
0 1 2 3 4 5 6 7 8
[root@shell day05]# echo ${#oldboy[*]}  #查看数组元素个数
8
[root@shell day05]# oldboy=(ljg wd lcx gyj wx gds lfx hyj rh)   #数组的批量赋值
[root@shell day05]# echo ${oldboy[*]}
ljg wd lcx gyj wx gds lfx hyj rh

3.2 删除数组

[root@shell day05]# unset oldboy
[root@shell day05]# echo ${oldboy[@]}
[root@shell day05]# declare -a oldboy   #定义空数组
[root@shell day05]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -ar BASH_REMATCH='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a oldboy='()'  #定义成功的数组

3.3 关联数组

declare -A  #查看关联数组

查看关联数组方式和查看普通数组方式相同
第十六周-day68—Shell编程day05_第11张图片
第十六周-day68—Shell编程day05_第12张图片

练习题

1、学员信息系统,包括输入学员姓名,年龄,性别,输入指定个数之后,就可以进行查询

第十六周-day68—Shell编程day05_第13张图片
image.png
[root@shell day05]# cat shuzu.sh
#!/bin/bash
##############################################################
# File Name: shuzu.sh
# Version: V1.0
# Author: lcx
# Organization: www.oldboyedu.com
##############################################################
export LANG="zh_CH.UTF-8"
declare -a name
declare -a age
declare -a sex
for ((i=0;i<5;i++));do
cat << EOF
============== 学生信息录入 ===============
EOF
    read -p "请输入学生的姓名:" n
    read -p "请输入学生的年龄:" a
    read -p "请输入学生的性别:" s

    name[$i]=$n
    age[$i]=$a
    sex[$i]=$s
done

while true ;do
cat << EOF
============== 学生信息录入 ===============
EOF
read -p "请输入学生的id:[exit退出]" id
if [ $id -ge 0 -a $id -le 4 ];then

    echo "学生的姓名是:${name[$id]}"
    echo "学生的年龄是:${age[$id]}"
    echo "学生的性别是:${sex[$id]}"
elif [ "$id" = "exit" ];then
    exit
else
    echo "请输入正确内容![0-4]"
fi
done
============== 学生信息录入 ===============
请输入学生的id:[exit退出]1
学生的姓名是:王达
学生的年龄是:20
学生的性别是:男
============== 学生信息录入 ===============
请输入学生的id:[exit退出]0
学生的姓名是:书¢菊贵
学生的年龄是:30
学生的性别是:男
============== 学生信息录入 ===============
请输入学生的id:[exit退出]2
学生的姓名是:李晨星
学生的年龄是:22
学生的性别是:男
============== 学生信息录入 ===============
请输入学生的id:[exit退出]3
学生的姓名是:脨胡胡玉甲
学生的年龄是:25
学生的性别是:女
============== 学生信息录入 ===============
请输入学生的id:[exit退出]4
学生的姓名是:郭永杰
学生的年龄是:30
学生的性别是:男

你可能感兴趣的:(第十六周-day68—Shell编程day05)