Shell脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环案例
Shell脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环案例
- 1 案例1:Shell脚本的编写及测试
- 1.1 问题
- 1.2 方案
- 1.3 步骤
- 2 案例2:重定向输出的应用
- 2.1 问题
- 2.2 方案
- 2.3 步骤
- 3 案例3:使用特殊变量
- 3.1 问题
- 3.2 方案
- 3.3 步骤
- 4 案例4:编写一个判断脚本
- 4.1 问题
- 4.2 方案
- 4.3 步骤
- 5 案例5:编写一个批量添加用户脚本
- 5.1 问题
- 5.2 方案
- 5.3 步骤
1 案例1:Shell脚本的编写及测试
1.1 问题
本例要求两个简单的Shell脚本程序,任务目标如下:
编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello World!!”
编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的版本信息、当前使用的内核版本、当前系统的主机名
1.2 方案
规范Shell脚本的一般组成:
#! 环境声明(Sha-Bang)
# 注释文本
可执行代码
1.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
2 案例2:重定向输出的应用
2.1 问题
本例要求编写一个脚本 /root/out.sh,功能特性如下:
执行此脚本显示 I love study !!
执行 /root/out.sh 2> err.log 应该没有显示,但是查看 err.log 文件的内容为 I love study !!
2.2 方案
屏幕输出文本的类别:
标准输出(1):命令行执行正常的显示结果
标准错误(2):命令行执行出错或异常时的显示结果
将屏幕显示信息保存到文件:
cmd > file 、 cmd >> file
cmd 2> file 、 cmd 2>> file
cmd &> file 、cmd 2> file 1>&2
使用1>&2或>&2操作,可以将命令行的标准输出编程标准错误。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤:编写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 !!
3 案例3:使用特殊变量
3.1 问题
本例要求编写一个脚本 /root/myuseradd,功能特性如下:
1)此脚本可接收2个位置参数,能够按照下列格式执行:
/root/myuseradd 用户名 密码
2)此脚本执行后,能显示“一共提供了 $# 个参数”,然后在下一行显示“用户名是 $1,密码是 $2 ”,紧跟下一行开始输出对应文件的前几行内容。
3.2 方案
使用位置变量可以取得在执行脚本时提供的命令行参数:
表示为 $n,n为序号
$1、$2、… … 10、{10}、10、{11}、… …
使用预定义变量$#可以统计执行脚本时提供的位置变量个数。
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写 /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)
4 案例4:编写一个判断脚本
4.1 问题
本例要求在虚拟机 server0 上创建 /root/foo.sh 脚本,任务目标如下:
当运行/root/foo.sh redhat,输出为fedora
当运行/root/foo.sh fedora,输出为redhat
当没有任何参数或者参数不是 redhat 或者 fedora时,其错误输出产生以下信息: /root/foo.sh redhat|fedora
4.2 方案
Shell脚本中执行条件测试的方式:
任何一条命令行
test 测试表达式
[ 测试表达式 ]
常用的test测试选项:
文件状态检测 -f、-d、-e、-r、-w、-x
整数值比较 -gt、-ge、-eq、-ne、-lt、-le
字符串比较 ==、!=
取反操作 !
多分支if选择结构:
if 条件测试操作1;then
命令序列1…
elif 条件测试操作2;then
命令序列2…
else
命令序列3…
fi
4.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写foo.sh判断脚本
1)编写脚本代码
[root@server0 ~]# vim /root/foo.sh
#!/bin/bash
if [ $# -eq 0 ];then
echo “/root/foo.sh redhat|fedora” >&2
elif [ $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
5 案例5:编写一个批量添加用户脚本
5.1 问题
本例要求在虚拟机 server0 上创建 /root/batchusers 脚本,任务目标如下:
此脚本要求提供用户名列表文件作为参数
如果没有提供参数,此脚本应该给出提示 Usage: /root/batchusers,退出并返回相应值
如果提供一个不存在的文件,此脚本应该给出提示 Input file not found,退出并返回相应值
新用户的登录Shell为 /bin/false,无需设置密码
列表测试文件:http://classroom/pub/materials/userlist
5.2 方案
单分支if选择结构:
if 条件测试操作
then
命令序列…
fi
脚本的退出状态:取决于退出前最后一条命令的 $? 值,或者“exit 整数值”指定。
列表式for循环结构:
for 变量名 in 值1 值2 值3 … …
do
命令序列(变量名)done使用命令替换来获取命令结果:变量名) done 使用命令替换来获取命令结果:变量名)done使用命令替换来获取命令结果:(命令行)
5.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写batchusers批量添加用户脚本
1)编写脚本代码
[root@server0 ~]# vim /root/batchusers
#!/bin/bash
if [ $# -eq 0 ] ; then
echo “Usage: /root/batchusers ” >&2
exit 1
fi
if [ ! -f $1 ] ; then
echo “Input file not found” >&2
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
[root@server0 ~]# echo $?
1
[root@server0 ~]# /root/batchusers /root/userlist.txt //提供的列表文件找不到
Input file not found
[root@server0 ~]# echo $?
2
————————————————
版权声明:本文为CSDN博主「我爱DC」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36345864/article/details/104828172
Shell脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环案例相关推荐
- shell脚本基础(环境变量、重定向、数学运算、退出脚本)
一.使用环境变量 1.环境变量 所谓环境变量,就是用来存储有关shell会话和工作环境信息的特性,这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们.这也是存储持久数据 ...
- linux脚本变量运算符,linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)...
Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽 ...
- Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Linux shell脚本基础学习详细介绍(完整版)
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Shell脚本基础及常用的四剑客
Shell脚本基础及应用 一.shell变量 二.判断语句 if语句 if语句实战 三.循环语句 for循环 while循环 until循环 四.选择语句 case语句 五.四剑客 grep sed ...
- 2.4 shell 脚本基础
到现在为止,你明白什么是shell脚本吗?如果明白最好了,不明白也没有关系,相信随着学习的深入你就会越来越了解到底什么是shell脚本.首先它是一个脚本,并不能作为正式的编程语言.因为是跑在linux ...
- 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量...
2019独角兽企业重金招聘Python工程师标准>>> 20.1 shell脚本介绍 shell 是一种脚本语言:和传统的开发语言比较,会比较简单 shell有自己的语法:可以使用逻 ...
- shell脚本中的变量
shell脚本中的变量 1 变量的定义 2 shell脚本中变量的定义方法 2.1 环境级别 2.2 用户级别 2.3 系统级别 3 变量名称 4 变量的转译 4.1 转译 4.2 声明 4.3 变量 ...
最新文章
- 物联网安全只有最薄弱的环节才有保障
- redis python zset
- windows配置maven环境并换源
- [Java]Object有哪些公用方法?
- 推荐系统笔记(信息消费)
- 58金融产品经理董宁:互金产品设计21问
- 人工神经网络之激活函数总结
- Spring Data Solr教程:CRUD(差不多)
- matlab斜杠报错,java调用matlab 时出现java.lang.NullPointerException错误
- 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
- asp.net 页面转向 Response.Redirect, Server.Transfer, Server.Execute的区别
- mysql 删除foreign key_MySQL-Foreign Key
- MySQL数据表类型及文件结构
- vue开发中v-for在Eslint的规则检查下出现:Elements in iteration expect to have 'v-bind:key' directives...
- sshv2 mitm工具jmitm2的使用记录
- 新手如何学习网络安全?
- android 设内网固定ip,如何给手机设置一个固定的内网ip
- 真爱,就要失去自己?
- 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了
- 微信分享服务器,微信分享的链接会被腾讯后台先访问
热门文章
- 基于激光雷达构建高精度点云地图及其感知定位
- S4D440-Custom Code Adaption for SAP S/4HANA-笔记
- Redis的配置文件redis.conf的解析
- [高数]e^x(sinx)^2的不定积分
- Neeto - 我所期待的MD编辑器
- 三、仪表读数识别算法的开发——1. 整体思路
- bartender的api帮助_在浏览器中通过bartender,调用条码打印机的active控件代码的实现...
- 《统计学》——思考题第八章假设检验(贾俊平)
- hooker pro入门文档
- 搭建Prometheus配置企业微信告警