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)
真的可行(wzb)真的可行(wzb)
上一篇 2016-08-22
下一篇 2016-08-22

相关推荐

  • CentOS6.8编译安装—- php-fpm

    安装环境: [root@station11 ~]# lsb_release -a Distributor ID: CentOS Description:     CentOS release 6.8 (Final) Release:  6.8 Codename:    …

    Linux干货 2016-12-21
  • KVM 快照管理

    1. 快照分类 2. 创建快照的方式     2.1 内置快照         2.1.1 使用 qemu-img 命令:关机状态下         2.1.2 使用 virsh 命令(qemu-monitor…

    Linux干货 2016-02-14
  • bash脚本循环语句用法练习

    bash脚本循环语句用法练习 1、使用循环语句写一个脚本,实现打印出来国际象棋的棋盘 #方法1:使用until循环语句实现 [root@liang7 bin]# cat chess-until.sh  #!/bin/bash #Author:liang #Version:1.0 #Description:Print&n…

    Linux干货 2016-08-24
  • Linux 第11&12天: Linux软件包管理

    Linux 第11&12天: Linux软件包管理      在系统管理中, 软件包的管理是最重要的, 是系统管理的基础,   本文主要是记录内容有: RPM二进制包的管理,YUM二进制包的管理, 源代码包的管理   软件运行环境API:Application Programming Interfac…

    Linux干货 2016-08-22
  • Linux 文本查看及处理工具&&用户和组管理

    1、列出当前系统上所有已登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d ' ' -f 1 | sort -u 2、取出最后登入到当前系统的相关信息。 ~]# last&…

    Linux干货 2016-10-05
  • 马哥教育21期网络班—第二周课程+练习

    目录管理类命令: mkdir, rmdir, tree mkdir mkdir [options] /path/to/somewhere -p: 存在于不报错,且可自动创建所需的各目录; -v: 显示详细信息 -m MODE: 创建目录时直接指定权限; tree tree:  需要安装  yum -y install …

    Linux干货 2016-06-29