在案例中学习shell编程

1. 编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,IPv4 地址,

操作系统版本,内核版本,CPU 型号,内存大小,硬盘大小。

分析:

解释:

此题是一堆命令的堆叠,首先我们很容易在命令行通过命令知道题目中的一些结果。

主机名:hostname命令就可以了。
IPV4地址:ifconfig命令是用来查看ip地址的,只是有很多多余内容,那么我们可以通过正则表达式,

以及cut命令即可截取。

操作系统版本:使用cat /etc/redhat-relase即可查得。
内核版本:uname -r 可以了。
CPU型号:有一个文件是关于cpu的即/proc/cpuinfo,这里是要cpu的型号,我们使用grep

结合正则截取含有mode的就很容易得到想要的结果。

内存大小:也有一个文件关于内存的即/proc/meminfo接下来就是截取的问题了。
硬盘大小:使用命令 fdisk -l ,可以查看到详细信息,接下来使用grep和cut得到想要的列。

在这里我们需要知道如何调用一个命令可以使用 $(命令)或·命令·这两种方式 。

得到内存的大小,还可以使用free -m ,计算内存的大小时,如果需要转换单位,那就得

知道如何进行变量之间的运算了,后面会提到 。

看似简单的题,更让我们学会:

1.写脚本规范很重要

2.使用变量可以让脚本变得比较有调理

3.熟练使用正则可以让我们事半功倍

答:

#!/bin/bash
#------------------------
#Filename:systeminfo.sh
#Revision:1.0
#Date:2017-08-08
#Description:systeminfo
#------------------------
Ipv4=`ifconfig eth0 |grep "\<inet\>"|tr -s ‘ ‘ :|cut -d : -f 4`
Sysmode=`cat /etc/redhat-release`
Kermode=`uname -r`
CPU=`lscpu|grep "Model name"|cut -d : -f 2|tr -s ‘ ‘`
Ferr=$[$(cat /proc/meminfo |head -1|grep -o "[[:digit:]]\+")/1024]
Fdisk=`fdisk -l|head -n 2|tail -1 |cut -d , -f 1 |cut -d: -f2`
echo "系统基本信息"
echo "主机名:$(hostname)"
echo "IPV4地址:$Ipv4"
echo "系统版本:$Sysmode"
echo "内核版本:$Kermode"
echo "CPU型号:$CPU"
echo "内存大小:${Ferr}MB"
echo "硬盘大小:$Fdisk"
unset Ipv4 Sysmode Kermode CPU Ferr Fdisk

#########################################################

最后讲一下关于变量之间的计算的,在这里只讲三种方法:

方法一 :let  var=算数表达式  eg.  let  count=2+4     echo $count  就变成6了,推荐使用此发

方法二:var=$[算数表达式 ]  eg.  count=$[2*3]   echo $count  变成6了

方法三:var=((算数表达式))和上例差不多。

2. 编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和.

分析:

解释:

既然是计算UID之和,那么我们首先必须知道如何得出UID,方法并不难,使用cut以冒号为分隔符,就可以得到我

们想要的UID,剩下的事情就是如何计算两个数的和,在上一题中我们也教大家方法了,这次我们来详细讨论如

何计算两个变量之和,还有我们需要注意的是,本题中是第10个用户和第20个用户UID之和,如何使该题的通用

性增强呢,也就是说,当我们输入数字(代表第几个用户),就能计算之和,这是后我们就需要考虑使用位置

变量,当然也会涉及正则表达式的内容。举个例子,加入我们输入的不是10和20,而是一个未知数,只能用

$1和$2替代,得想办法筛选出$1行和$2行的UID并计算,我们可以使用cat -n 显示行号,然后利用正则筛选,

用cut截取,下面我们来看看具体实现方法。

答:

#!/bin/bash
#--------------------
#Filename:sumid.sh
#Revision:2.0
#Description:UID sum
#--------------------
read -p "please you input two arg:" number1 number2
root1=$(cat /etc/passwd | head -n $number1 |tail -1 | cut -d: -f3)
root2=$(cat /etc/passwd | head -n $number2 |tail -1 | cut -d: -f3)
let sumid=root1+root2
echo "第$number1个用户和第$number2个用户UID之和为:$sumid"
unset number1 number2 root1 root2

----------------------------------------------------------------------------------------------

3. 编写脚本/root/bin/argsnumsh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户

“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数。

分析 :

解释: 

首先我们知道位置变量有一个是计算参数个数的,即$#,下面我们只要利用好此变量就可以做判断。
为了考虑全面一点,我们需要可以考虑文件是否存在的情况,最后一个难点是如何计算空白的数量。
^$我们知道是空白行,不要忘记考虑里面有空格的情况,所以最后结果为“^[[:space:]]*$”.

答:

#!/bin/bash
#--------------------------
#Filename:argsnumsh
#Revision:3.0
#Date:2017-08-10
#Description:determine args
#--------------------------
[ $# -lt 1 ]&&echo "至少应该给一个参数"&&exit 1
[ -f $1 ]||(echo "please you input exist file";exit 1)||exit 1
Space=`grep "^[[:space:]]*$" $1|wc -l `
[ $# -ge 1 ]&&echo "第一个参数文件的空白行为:${Space}行"&&exit 0
unset Space

4.编写一个脚本/root/bin/createuser.sh,脚本的执行语法必须是:createuser.sh -u username -m password,

选项与参数间可支持多空格,但不能顺序颠倒。当未指定正确的选项或参数时,以错误输出方式提示

“createuser.sh -u username -m password ”后退出脚本。用户名必须以字母开头,可包括数字和_。

否则不合法。以错误输出提示用户"用户名仅包含字母数据和下划线",当用户名检测合法后,判断用户名

是否已存在,若存在,再判断用户是否已设置过密码,若设置过密码,直接退出,未设置,则将密码设置

为所指定的密码后以正确输出方式显示“username 密码已更新后退出”当用户名不存在,则创建用户,

并为该用户设置所指定的密码后以正确输出方式显示“用户username已创建并更新密码”要求脚本执行

过程中不能有非要求的其他输出结果出现。脚本在非正确方式退出时应反回给?参数非0值。

分析:

解释:

这道题相对上面几道题是有一定难度的,但是细细分析还是有思路可循。首先是确定格式,可以想到会使用

位置变量,$1,$2,$3.. 可以确定的有$1为 -u,$3为-m $2 和$4无法确定,但是可以确定参数个数,即$#为4,

这时,我们使用简单的判断句是可以解决的。下面进行下一个任务,判断用户名是否合法,也就是对$2的判断,

题目中要求用户名必须以字母开头,可包括数字和_,可以使用正则表达式,写出要求,这应该不难即

“^[[:alpha:]]\([[:alnum:]]\|_\)*”这里使用的是标准正则表达式,使用此条件去匹配用户提供的用户名,

不合符提示题目中的语句。接下来判断用户名是否存在,使用的方法当然是使用id命令,若返回值为正确,

那么接下来是判断密码的存在性,使用的方法是看/etc/shadow文件,观察密码位的情况,

若用户不存在时就创建用户,并设置密码,这比较简单,下面解答。

答:

方法一:

#!/bin/bash
#-----------------------
#Filename:createuser.sh
#Revision:7.0
#Date:2017-08-11
#Description:create user
#-----------------------
#判断用户名是否规范,并且给出返回值
decide=`echo $2|grep "^[[:alpha:]]\([[:alnum:]]\|_\)*$" &>/dev/null;echo $?`
#判断用户是否存在,并给出返回值
id=`id $2 &>/dev/null;echo $?`
#截取用户密码位
mima=`getent shadow $2 |cut -d: -f 2`
#判断第一个参数
if [ "$1" != "-u" ];then
         echo "createuser.sh -u username -m password"
         exit 1
fi

#判断第三个参数
if [ "$3" != "-m" ];then
          echo "createuser.sh -u username -m password"
          exit 1
fi
#判断参数个数
if [ $# -ne 4 ];then
          echo " createuser.sh -u username -m password"
          exit 1
fi
#判断第二个参数
if [ $decide -ne 0 ];then
           echo "用户仅包含字母数字和下划线"
           exit 1
else
if [ $id -eq 0 ];then
           if [ "$mima" == "!!" -o "$mima" == "" ];then
           echo "$4" |passwd --stdin $2 &>/dev/null
           echo "$2密码已更新"
           exit 1
else
           exit 1
fi
else

`useradd $2`
          `echo $4 |passwd --stdin $2 &>/dev/null`
          echo "用户$2已创建并更新密码"

fi
fi

unset  decide  id mima

方法二:

[ $1 = "-u" -a $3 = "-m" -a $# -eq 4 ] &>/dev/null ||(echo createuser.sh -u username -m password 1>&2 && exit

1)&&(echo$2|egrep "\<^[[:alpha:]]([[:digit:]]|_|[[:alpha:]])*$\>" &>/dev/null ||(echo 用户名仅包含字母数>

据和下划线 1>&2 ;exit 1  ) &&(  `id $2 &>/dev/null` ||(`useradd $2` ;echo $4 |passwd --stdin $2 &>/dev/null &&

echo 用户${2}已创建并更新密码;exit 1

) &&(getent shadow $2 |egrep ‘\$‘[[:digit:]]‘\$‘ &>/dev/null &&(echo 密码已存>

在 1>&2 ;exit 0

)||(

echo $4 |passwd --stdin $2 &>/dev/null &&echo 用户${2}密码已更新;exit 1

)||exit 1)||exit 1)||exit 1) ||exit 1

总结:方法一更容易理解一点 ,方法二逻辑思维比较强,各有各的好处 。

 

时间: 2024-11-09 21:21:17

在案例中学习shell编程的相关文章

精讲shell基础以及如何高效的学习shell编程

1.前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容.每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础 1.2 学好Shell编程所需的基础知识

零基础学习Shell编程

一:起因 (0)也许由于一时的冲动使得你开始关注并学习shell编程:亦许由于是"道听途说"shell的威力很大:亦许由于shell编程的魅力:亦许由于作为一个coder的偏好:亦许-- (1)先来搞清楚为什么要学shell,学习要有目的性 ---- 简单的说shell就是一个包含若干行Shell或者Linux命令的文件.对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用. shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自

从案例中学习SQL数据库优化

下载地址:百度网盘下载 课程目录: 1.从案例中推导SQL优化的总体思路与误区2.从案例中分析体系结构如何左右SQL性能3.从案例中体验逻辑结构如何影响SQL优化4.从案例中探寻表设计对SQL优化的重要性5.从案例中明白索引是如何让SQL运行飞快6.从案例中体会索引让SQL举步维艰的一面7.从案例中体会函数及位图索引与SQL优化8.从案例中洞察表连接与SQL优化之间关系9.从案例中探讨该如何分析读懂析执行计划10.从案例中弄清如何正确选择SQL性能工具11.从案例中学习如何进行不改写SQL的优化

理论:详细学习shell编程规范与变量————理论讲解 初学者一定要点进来

前言: shell脚本编程规范 shell脚本应用场景 shell编程规范 管道与重定向 shell脚本变量揭秘 自定义变量 特殊变量 本次学习了解的是变量 语言分为两大类 1.强语言:定义变量的时候需要声明数据类型,一旦声明,就不可变 jave c语言 1整型 init 1 2 3 100 长整型 long 2浮点型 单精度 float 4字节 双精度 double 8字节 带小数点就是浮点型 3.string 字符串 char 字符 英文字母字符 a 占一个字节 ? 中文汉字字符,男 占两个

大数据学习——shell编程

03/ shell编程综合练习 自动化软件部署脚本 3.1 需求 1.需求描述 公司内有一个N个节点的集群,需要统一安装一些软件(jdk) 需要开发一个脚本,实现对集群中的N台节点批量自动下载.安装jdk 2.思路 1/ 编写一个启动脚本,用来发送一个软件安装脚本到每一台机器 2/ 然后启动每台机器上的软件安装脚本来执行软件下载和安装 3.expect的使用 痛点:使用scp命令远程拷贝文件时,会有人机交互的过程,如何让脚本完成人机交互? 妙药: expect 用法示例: 先观察  ssh lo

makefile中的shell编程注意点

参考:http://blog.csdn.net/wanglang3081/article/details/49423105 (1)Makefile本质上来讲也是shell脚本,即每条command都是shell进程,运行完shell进程都会退出.   (2)shell代码行,如果有=的话,=两边不能有空格   (3)Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递.所以,Makefile中的shell不管多长也要写在一行.可以用\来分行写,格式更清晰一点. SUBDIR

从闭包案例中学习闭包的作用,会不会由你。

在文章初识js中的闭包中讲解了闭包的一些概念,但是对于初学者来说可能并不是特别的容易理解,我今天用两个案例来解释闭包可能会好理解一些,在讲案例之前,我们需要了解一些闭包的概念.在看这篇文章之前,请先看上面的那篇文章,不然效果不会太好. 闭包的理解: 所谓的闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,互不干扰. 闭包的创建: 一个函数中嵌套另外一个函数,并且将这个函数return出去,然后将这个return出来的函数保存到了一个变量中,那么就创建了一个闭包. 为啥要学闭包之没有使

linux中的shell编程----基础

1,运行shell脚本有两种办法一般有两种: 先给可执行权限,再进入文件所在的目录,输入:./name.sh: 运行解释器再执行脚本:/bin/sh name.sh,这种情况下,脚本中可以没有#!/bin/bash的情况. 2,shell变量     变量命名规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字 开头. 变量名和等号,变量名中间也不能有空格,可以使用下划线(_). 不能使用标点符号. 不能使用bash里的关键字 变量赋值: 直接赋值 可以使用for xx in name

什么是Shell?Shell脚本是什么?shell脚本执行过程?学习Shell编程必看!

1.什么是Shell? 首先请看图----自动略过各位都是新手(CaiJi) 聪明的你如图所得: Shell=命令解释器它的作用是执行并解释用户输入的命令及脚本,用户键入一条命令,Shell就执行并解释一条.键入命令,就可以立即得到回应的对话方式,被称之为为交互式.Shell它存在于操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户,当我们输入系统用户名和密码,登录到Linux后的所有操作都是由Shell解释并执行的. 所以