shell脚本编程小节及作业

使用read命令来接收输入
    
    使用read来把输入值分配给一个或多个shell变量:
        -p:指定要显示的提示
        -t:timeout
    read 从标准输入中读取值,给每个单词分配一个变量,
    所有剩余单词都被分配给最后一个变量
    示例:
    read -p "Enter a filename: " File
多条件选择if语句
    选择执行,if语句可以嵌套
    格式:
    单分支
        if 判断条件;then
            条件为真的分支代码
        fi
    双分支
        if 判断条件;then
            条件为真的分支代码
        else
            条件为假的分支代码
        fi
    多分支
        if condition1(条件1);then
            if-true
        elif condition2;then
            if-true
        elif condition3;then
            if-true
            ...
        else
            all-false
        fi
    逐条件进行判断,第一次遇为"真"条件时,执行其分支,而后结束整个if语句。
    
条件判断:case语句
    
    适合离散值。
    case 变量引用 in        case支持glob风格的通配符
    PAT1)                       *:任意长度任意字符
        分支1                   ?:任意单个字符
        ;;                      []:指定范围内的任意单个字符
    PAT2)                       a|b:a或b
        分支2
        ;;
    ...
    *)
        默认分支
        ;;
    esac
循环语句
    
    循环执行
        将某代码段重复运行多次
        重复运行多少次:
            循环次数事先已知
            循环次数事先未知
        有进入条件和退出条件
    for,while,until
    
for循环
    
    for 变量名 in 列表;do
        循环体
    done
    执行机制:
        依次将列表中的元素赋值给"变量名";每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束。
    列表生产方式:
        直接给出列表
        整数列表
            {start..end}
            $(seq [start[step]] end)
        返回列表的命令
            $(COMMAND)
        使用glob,如:*.sh
        变量引用
            $@,$*
函数
- function(){...COMMAND} 格式
- 调用直接写上函数名
break
continue

作业
1. 编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
```
#/bin/bash
HostInfo=`cat /etc/centos-release`
HostName=`hostname`
IPaddr=` ifconfig | grep "inet addr" | tr -s " " | head -1 | cut -d: -f2 | cut -d " " -f1`
OSinfo=`cat /etc/centos-release`
KernelInfo=`uname -r`
CpuInfo=`cat /proc/cpuinfo | grep "model name" | uniq | cut -d : -f2`
MemInfo=`cat /proc/meminfo | grep "MemTotal" | tr -s " "`
DiskSpace=`fdisk -l | grep "Disk" | grep /dev/sda | cut -d: -f2 | cut -d , -f1`
echo -e "HostInfo:\033[21;31m$HostInfo \033[0m"
echo -e "HostName:\033[32m$HostName \033[0m"
echo -e "IPaddr:\033[33m$IPaddr \033[0m"
echo -e "OSinfo:\033[34m$OSinfo \033[0m"
echo -e "KernelInfo:\033[35m$KernelInfo \033[0m"
echo -e "MemInfo:\033[36m$MemInfo \033[0m"
echo -e "DiskSpace:\033[41;37m$DiskSpace \033[0m"
```
2. 编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
> ```
> #/bin/bash
> #复制目录就在opt目录下创建etc当天命名的文件夹
> #复制文件就在opt目录下创建etc当天命名的文件
> BackupFile=/opt/etc`date +%F`
> cp -r /etc $BackupFile && echo "/etcFile备份完成"
> unset BackupFile
> ```
3. 编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
> ```
> #/bin/bash
> declare -i Use
> Use=15
> Disk=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f1`
> DiskuseSpace=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f5` | sed "s/\([[:digit:]]\+\).*/\1/g"
> [[ "$DiskuseSpace" -gt "$Use" ]] && echo "磁盘空间不足,注意清理." && echo "空间利用率$Disk是最大值$DiskuseSpace."
> unset Use
> unset Disk
> unset DiskuseSpace
> ```
4. 编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
> ```
> #/bin/bash
> netstat -tn | grep "tcp" | tr -s " " | cut -d " " -f5 | sed "s/\([0-1][0-9][1-9].\)\([0-1][0-9][1-9].\)\([1-9].\)\([0-1][0-9][1-9]\).*/\1\2\3\4/g" | wc -l | sort -nr
> ```
5. 写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
> ```
> #/bin/bash
> sum1=`sed -n '10p' /etc/passwd | cut -d: -f3`
> sum2=`sed -n `20p` /etc/passwd | cut -d: -f3`
> let sum=$sum1+$sum2
> echo "UserID sum is $sum"
> ```
6. 写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
> ```
> #/bin/bash
> echo "Give a one file Path:$1"
> echo "Give a two file Path:$2"
> sum1=`grep "^$" $1 | wc -l`
> sum2=`grep "^$" $2 | wc -l`
> let sum=$sum1+$sum2
> echo $sum
> ```
7. 写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
> ```
> #/bin/bash
> read -p "Enter your FilePath:" A B C
> sum1=`ls -rA $A | wc -l`
> sum2=`ls -rA $B | wc -l`
> sum3=`ls -rA $C | wc -l`
> let sum=$sum1+$sum2+$sum3
> echo $sum1
> echo $sum2
> echo $sum3
> echo $sum
> ```
8. 写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
> ```
> #/bin/bash
> read -p "请输入Path:" A
> [ -z "$A" ] && echo "至少应该给一个参数"&& exit 13
> [ -n "$A" ] && spaceline=`grep "^$" $A | wc -l`
> echo "$spaceline"
> ```
9. 写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
> ```
> #/bin/bash
> ping -c3 $1 &> /dev/null && echo "该ip地址可以访问" || echo "该ip地址不可访问"
> ```
10. chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写
>  ```
> #/bin/bash
> read -p "Enter a file name:" File
> [ -r "$File" -a -w "$File" ] && echo "此用户可读可写!" || echo "此用户不可读且不可写。"
>  ```
11. 编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。
> ```
> #/bin/bash
> #ShellName nologin.sh
> Nologin=/etc/nologin
> [ -e $Nologin ] && echo "已禁止普通用户登录!" || touch $Nologin
> ```
> ```
> #/bin/bash
> #ShellName login.sh
> Login=/etc/nologin
> [ -e $Login ] && echo "禁止普通用户登录文件存在。";rm $Login
> ```
12. 写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
> ```
> #/bin/bash
> #Shell name hostping
> #author WZB
> echo "请输入一个IP:$1"
> [[ -n "$1" ]] && echo "This IP is True!!" && ping -c3 $1 &>/dev/null && echo "$1可以访问" || echo "$1不可以访问" || echo "IP address is false";exit 13
> ```
13. 计算1+2+3+...+100的值
```
#/bin/bash
#author WZB
sum=0
for i in `seq 1 1 100`;do
    let "sum+=i"
done
echo "$sum"
#echo {1..100} | tr " " "+" | bc
```
14. 计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
> ```
> #/bin/bash
> #author WZB
> echo "第一个参数A:$1"
> echo "第二个参数B:$2"
> 
> [[ $2 -gt $1 ]] && let sum=$2+$1 && echo "sum的值:$sum" || echo "B不大于A,已退出请重新执行。";exit3
> 
> unset sum
> ```
```
[[ $1 = ~\b[[:digit:]]+\b ]]匹配任意数字
```
```
seq -s(指定分隔符) + 1 10
```

原创文章,作者:真的可行(wzb),如若转载,请注明出处:http://www.178linux.com/36186

(0)
上一篇 2016-08-22 09:29
下一篇 2016-08-22 09:29

相关推荐

  • N23_第六周

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#;:%s/^[[:blank:]]\+.*/\0#/g 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符;:%s/^[[:space:]]\+/…

    Linux干货 2017-02-28
  • 第一周作业

    描述计算机的组成及其功能。 由冯~诺伊曼提出计算机体系结构,计算机主要由控制器、运算器、存储器、输入设备、输出设备五大硬件组成。 控制器(Controller):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。 运算器(Datapath):运算器的功能是对数据进…

    Linux干货 2017-02-07
  • Linux 系统启动流程及bash 脚本编程练习

    马哥教育网络班23期 第10周课堂练习 Linux 系统启动流程及bash 脚本编程练习1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区; (1)为硬盘新建两个主分区;并为其安装grub; (2)为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供r…

    Linux干货 2017-01-23
  • Linux磁盘及文件系统管理

    Linux磁盘及文件系统管理 创建文件系统      mkfs.ext#     .xfs mke2fs 功能比mkfs强大的多 检测及修复     fsck      …

    Linux干货 2016-08-30
  • Linux获取命令帮助的途径

    在学习和使用Linux的过程中,免不了会遇到一些我们不熟悉或者不知道的命令。对于这些我们不熟悉的命令,就需要查找帮助文档来获取更多信息来协助我们完成相关的工作。 如何获取Linux命令的使用帮助? 1.  针对内部命令 help [命令名] 2.  针对外部命令 [命令名] –help,    获取简要帮助…

    Linux干货 2017-09-01
  • 第九周脚本练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; awk -F: ‘{if($NF!=”/sbin/nologin”) print $1}’ /etc/passwd | wc -l 2、写一个脚本 (1) 获取当前主机的主机名,保存于ho…

    Linux干货 2017-03-30