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

相关推荐

  • 从Linux小白到大牛——与狼共舞的日子11

    马哥教育网络班21期+第10周课程练习 1、详细描述一次加密通讯的过程,结合图示最佳。 加密过程 1.使用单向加密算法,提取A的文件的特征码。 2.使用A的私钥对提取出来的特征码进行加密,把加密后的特征码附加在A的文件的后面。 3.使用对称加密对刚刚的A的文件和加密后的特征码进行加密,生成对称加密密钥 4.使用B的公钥对第3步骤的对称加密的密钥进行加密,加密…

    Linux干货 2016-12-05
  • 搭建缓存功能的WEB服务集群

    搭建缓存功能的WEB服务集群 实验简介 本文主要介绍双主模型的nginx proxy高可用集群的搭建方式。实验环境: 使用nfs服务器提供页面数据共享 使用单独的mariadb服务器提供关系型数据库 使用两台httpd服务器处理动态的php和静态页面资源 使用两台nginx服务器处理图片资源 使用两台varnish服务器作缓存处理 使用两台nginx作代理 …

    Linux干货 2017-07-15
  • N26-第四周-孙逸

    1、  复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 cp –r /etc/skel /home/tuser1 chmod –R 700 /home/tuser1 2、  编辑/etc/group文件,添加组hadoop。 group文件的内容格式: &…

    2017-03-10
  • Centos图形界面和命令行界面切换—-使用init

    1、从图形界面切换到命令行界面      点击Applications–System Tools–Terminal。    打开后输入: su root(运行init需要管理员权限) 按回车,输入init 3或者init 2都可以,然后回车就可以    进入命令行界…

    Linux干货 2015-11-10
  • N25-第十一周博客作业

    1、详细描述一次加密通讯的过程,结合图示最佳。 点对点加密过程如下: 发送方根据单向加密算法计算数据的特征码 用私钥加密这段特征码,生产数字签名,将数字签名附着在数据后面 发送方生产临时对称密钥,用对称加密算法结合对称加密密钥加密整段数据(数据+数字签名) 为保证接收方可以解密,发送方用接收方的公钥加密对称加密密钥,附加在数据后面 接收方用自己的私钥解密数据…

    Linux干货 2017-03-30
  • Linux文件类型及颜色标识

    文件类型(共7种): – :普通文件 d:目录文件 (directory) c:字符设备文件 (char) b:块设备文件 (block) s:本地域套接口 (socket) p:有名管道 (pipeline) l:符号连接 (link) 关于硬链接、软连接、复制之间的区别说明: 上图中,我为photo.png这个图片文件建立了一个拷贝(phot…

    Linux干货 2016-10-16