工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本
一、Shell脚本的编写及测
目标:
本例要求两个简单的Shell脚本程序,任务目标如下:
1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello World!!”
2> 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的版本信息、当前使用的内核版本、当前系统的主机名
方案:
规范Shell脚本的一般组成:
1> #! 环境声明(Sha-Bang)
2> # 注释文本
3> 可执行代码
步骤:
步骤一:编写helloworld.sh问候脚本
1)编写脚本代码
[root@server0 ~]# vim /root/helloworld.sh
#!/bin/bash
echo "Hello World !!"
2)添加x执行权限
[root@server0 ~]# chmod +x /root/helloworld.sh
3)运行脚本测试
[root@server0 ~]# /root/helloworld.sh
Hello World !!
步骤二:编写sysinfo系统信息报告脚本
1)编写脚本代码
[root@server0 ~]# vim /root/sysinfo
#!/bin/bash
cat /etc/redhat-release
uname -r
hostname
2)添加x执行权限
[root@server0 ~]# chmod +x /root/sysinfo
3)运行脚本测试
[root@server0 ~]# /root/sysinfo
Red Hat Enterprise Linux Server release 7.0 (Maipo)
3.10.0-123.el7.x86_64
server0.example.com
二、重定向输出的应用
目标:
本例要求编写一个脚本 /root/out.sh,功能特性如下:
1> 执行此脚本显示 I love study !!
2> 执行 /root/out.sh 2> err.log 应该没有显示,但是查看 err.log 文件的内容为 I love study !!
方案:
屏幕输出文本的类别:
1> 标准输出(1):命令行执行正常的显示结果
2> 标准错误(2):命令行执行出错或异常时的显示结果
将屏幕显示信息保存到文件:
1> cmd > file 、 cmd >> file
2> cmd 2> file 、 cmd 2>> file
3> cmd &> file 、cmd 2> file 1>&2
使用1>&2或>&2操作,可以将命令行的标准输出编程标准错误。
步骤:
步骤:编写out.sh输出测试脚本
1)编写脚本代码
[root@server0 ~]# vim /root/out.sh
#!/bin/bash
echo "I love study !!" >&2
2)添加x执行权限
[root@server0 ~]# chmod +x /root/out.sh
3)运行脚本测试
[root@server0 ~]# /root/out.sh
I love study !!
[root@server0 ~]# /root/out.sh 2> err.log
[root@server0 ~]# cat err.log
I love study !!
三、使用特殊变量
目标:
本例要求编写一个脚本 /root/myhead,功能特性如下:
1)此脚本可接收2个位置参数,能够按照下列格式执行:
/root/myhead 文件路径 行数
2)此脚本执行后,能显示“你一共提供了 $# 个参数”,然后在下一行显示“文件 $1 的前 $2 行: ”,紧跟下一行开始输出对应文件的前几行内容。
方案:
使用位置变量可以取得在执行脚本时提供的命令行参数:
- 表示为 $n,n为序号
- $1、$2、.. .. ${10}、${11}、.. ..
使用预定义变量$#可以统计执行脚本时提供的位置变量个数。
步骤:
步骤一:编写 /root/myuseradd 添加用户的脚本
1)编写脚本代码
[root@server0 ~]# vim /root/myuseradd
#!/bin/bash
echo "一共提供了 $# 个参数"
echo "用户名是 $1,密码是 $2 "
useradd $1
echo "$2" | passwd --stdin $1
2)添加x执行权限
[root@server0 ~]# chmod +x /root/myuseradd.sh
步骤二:测试 /root/myuseradd 脚本
1)测试添加用户 bob,密码设为 1234567
[root@server0 ~]# /root/myuseradd bob 1234567
一共提供了 2 个参数
用户名是 bob,密码是 1234567
更改用户 bob 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server0 ~]# id bob
uid=1002(bob) gid=1002(bob) 组=1002(bob)
2)测试添加用户 jerry,密码设为 1234567
[root@server0 ~]# /root/myuseradd jerry 1234567
一共提供了 2 个参数
用户名是 jerry,密码是 1234567
更改用户 jerry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server0 ~]# id jerry
uid=1003(jerry) gid=1003(jerry) 组=1003(jerry)
四、编写一个判断脚本
目标:
本例要求在虚拟机 server0 上创建 /root/foo.sh 脚本,任务目标如下:
1> 当运行/root/foo.sh redhat,输出为fedora
2> 当运行/root/foo.sh fedora,输出为redhat
3> 当没有任何参数或者参数不是 redhat 或者 fedora时,其错误输出产生以下信息: /root/foo.sh redhat|fedora
方案:
Shell脚本中执行条件测试的方式:
1> 任何一条命令行
2> test 测试表达式
3> [ 测试表达式 ]
常用的test测试选项:
1> 文件状态检测 -f、-d、-e、-r、-w、-x
2> 整数值比较 -gt、-ge、-eq、-ne、-lt、-le
3> 字符串比较 ==、!=
4> 取反操作 !
多分支if选择结构:
if 条件测试操作1
then
命令序列1....
elif 条件测试操作2
then
命令序列2....
else
命令序列3....
fi
步骤:
步骤一:编写foo.sh判断脚本
1)编写脚本代码
[root@server0 ~]# vim /root/foo.sh
#!/bin/bash
if [ "$1" = "redhat" ]
then
echo "fedora"
elif [ "$1" = "fedora" ]
then
echo "redhat"
else
echo "/root/foo.sh redhat|fedora" >&2
fi
2)添加x执行权限
[root@server0 ~]# chmod +x /root/foo.sh
步骤二:测试foo.sh判断脚本
1)测试提供正确参数的情况
[root@server0 ~]# /root/foo.sh redhat
fedora
[root@server0 ~]# /root/foo.sh fedora
Redhat
2)测试提供非预期参数的情况
[root@server0 ~]# /root/foo.sh ubuntu
/root/foo.sh redhat|fedora
3)测试不提供参数的情况
[root@server0 ~]# /root/foo.sh
/root/foo.sh redhat|fedora
五、编写一个批量添加用户脚本
目标:
本例要求在虚拟机 server0 上创建 /root/batchusers 脚本,任务目标如下:
1> 此脚本要求提供用户名列表文件作为参数
2> 如果没有提供参数,此脚本应该给出提示 Usage: /root/batchusers,退出并返回相应值
3> 如果提供一个不存在的文件,此脚本应该给出提示 Input file not found,退出并返回相应值
4> 新用户的登录Shell为 /bin/false,无需设置密码
5> 列表测试文件:http://classroom/pub/materials/userlist
方案:
单分支if选择结构:
if 条件测试操作
then
命令序列....
fi
脚本的退出状态:取决于退出前最后一条命令的 $? 值,或者“exit 整数值”指定。
列表式for循环结构:
for 变量名 in 值1 值2 值3 .. ..
do
命令序列($变量名)
done
使用命令替换来获取命令结果:$(命令行)
步骤:
步骤一:编写batchusers批量添加用户脚本
1)编写脚本代码
[root@server0 ~]# vim /root/batchusers
#!/bin/bash
if [ $# -eq 0 ] ; then
echo "Usage: /root/batchusers <userfile>"
exit 1
fi
if [ ! -f $1 ] ; then
echo "Input file not found"
exit 2
fi
for name in $(cat $1)
do
useradd -s /bin/false $name
done
2)添加x执行权限
[root@server0 ~]# chmod +x /root/batchusers
步骤二:测试batchusers批量添加用户脚本
1)下载用户列表测试文件:
[root@server0 ~]# wget http://classroom/pub/materials/userlist -O /root/userlist
.. ..
2016-11-27 17:23:32 (2.83 MB/s) - ‘/root/userlist’ saved [27/27]
[root@server0 ~]# cat /root/userlist //检查下载文件
duanwu
zhongqiu
zhsan
lisi
2)实现批量添加用户:
[root@server0 ~]# /root/batchusers /root/userlist
[root@server0 ~]# id duanwu
uid=1006(duanwu) gid=1006(duanwu) groups=1006(duanwu)
3)测试其他异常处理:
[root@server0 ~]# /root/batchusers //未提供列表文件
Usage: /root/batchusers <userfile>
[root@server0 ~]# echo $?
1
[root@server0 ~]# /root/batchusers /root/userlist.txt //提供的列表文件找不到
Input file not found
[root@server0 ~]# echo $?
2
工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本的更多相关文章
- shell编写一个批量添加用户脚本
shell编写一个批量添加用户脚本 5.1问题 本例要求在虚拟机server0上创建/roo ...
- (1)使用bash脚本实现批量添加用户
脚本实现内容: 可以指定用户名前缀,指定添加数量的批量添加用户脚本,密码为10为随机小写字母,并把用户名和密码写入文件中. 脚本代码: #!/bin/bashread -p "用户名前缀:& ...
- (转)通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加
通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加 原文:http://www.21yunwei.com/archives/4773 有一个朋友问我如何批量创建用户和设置密码 , ...
- centos7 lvm合并分区脚本初探-linux性能测试 -centos7修改网卡名字-jdk环境安装脚本-关键字查询文件-批量添加用户
1.#!/bin/bash lvmdiskscan | grep centos > /root/a.txt a=`sed -n '1p' /root/a.txt` b=`sed -n '2p' ...
- Linux账号管理与ALC权限设定(二) 批量增加用户脚本
接上篇.鸟哥提出了一个问题.就是 如果myuser1用户是这个项目的助理,他只能查看该目录下的内容,而无法修改删除.那该如何操作呢? 首先,不能将该用户加入projecta这个群组,否则他也可以修改删 ...
- sh3.useradd 添加用户脚本
1.写一个脚本: 添加10个用户user1到user10,密码同用户名,但要求只有用户不存在的情况下才能添加 #/bin/bash # ..};do if id user$i &> /d ...
- Linux实现批量添加用户及随机密码小脚本
通过chpasswd命令可实现迅速为用户批量设置密码 实例:写一个脚本,实现批量添加20个用户user1-20,密码为用户名和后面跟5个随机字符 #!/bin/sh # 思路:通过for循环, ...
- shell 脚本实战笔记(9)--linux自动批量添加用户
前言: 添加linux用户帐号,这个相对简单, 在面对集群, 许多机器的时候, 我们该如何去做和实现? 这篇短文, 简单讲解一些思路, 尽可能地涉及周边的一些知识点. 不光是运维人员会面临这个问题, ...
- shell之批量新增用户脚本(http-basic-auth)
user.txt(用户名记录文件) test001@.com test002@.com user.sh(shell脚本): for line in `cat user.txt` do echo $li ...
随机推荐
- 【CF906E】Reverses(回文自动机,最小回文分割)
题意:给定两个长度相等的仅由小写字母组成的串A和B,问在A中最少选择多少段互不相交的子串进行翻转能使A和B相同 len<=5e5 思路:构造新串S=a[1]b[1]a[2]b[2]...a[n] ...
- delphi 使用 InputBox、InputQuery 的启发
使用 InputBox.InputQuery 的启发 看了 InputBox.InputQuery 函数实现的源码, 有些收获与心得... ------------------------------ ...
- python中对列表元素大小排序(冒泡排序法和选择排序法)
前言:排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列.本文主要讲述python中经常用的两种排序算法,选择排序法 ...
- python装饰器参数那些事_接受参数的装饰器
# -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...
- python学习笔记之数据类型、字符编码、文件处理
1.数据类型 1.数字(int,float) 整形(int):定义 age=20 #本质age=int(20) 浮点类型:salary=3000.3 #本质salary=float(3000.3) ...
- code for QTP and ALM
'==========================================================================' Name: connectALM' Summa ...
- 搭建邮件服务器 使用Postfix与Dovecot
首先需要从yum中下载安装三个服务:bind-chroot postfix dovecot 配置文件依次: /etc/named.conf 下载安装完后要开启的服务:named ...
- Cocos2d-x之Sound
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 音效简介: 1.1 在游戏开发的过程中除了华丽的界面,生动的动画之外,适当的音效也是重要的一部分 1.2 游戏中的声音分为两类,一类是音乐 ...
- 转 zookeeper,dubbo和Nginx的区别
Nginx是著名的反向代理服务器,也被广泛的作为负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 那么他们的区别是什么?如何选择呢? 下面从实际场景看下他们的关系 Ngi ...
- mybatis小技巧
本节主要讲解mybatis如下五个方面的内容: foreach 批量插入 模糊查询like的写法 #{}和${}的区别 解决实体类中的属性名和表中的字段名不一致问题 由于每次建立工程比较复杂,可以参考 ...