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脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环案例相关推荐

  1. shell脚本基础(环境变量、重定向、数学运算、退出脚本)

    一.使用环境变量 1.环境变量 所谓环境变量,就是用来存储有关shell会话和工作环境信息的特性,这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们.这也是存储持久数据 ...

  2. linux脚本变量运算符,linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)...

    Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽 ...

  3. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  4. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  5. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  6. Shell脚本基础及常用的四剑客

    Shell脚本基础及应用 一.shell变量 二.判断语句 if语句 if语句实战 三.循环语句 for循环 while循环 until循环 四.选择语句 case语句 五.四剑客 grep sed ...

  7. 2.4 shell 脚本基础

    到现在为止,你明白什么是shell脚本吗?如果明白最好了,不明白也没有关系,相信随着学习的深入你就会越来越了解到底什么是shell脚本.首先它是一个脚本,并不能作为正式的编程语言.因为是跑在linux ...

  8. 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量...

    2019独角兽企业重金招聘Python工程师标准>>> 20.1 shell脚本介绍 shell 是一种脚本语言:和传统的开发语言比较,会比较简单 shell有自己的语法:可以使用逻 ...

  9. shell脚本中的变量

    shell脚本中的变量 1 变量的定义 2 shell脚本中变量的定义方法 2.1 环境级别 2.2 用户级别 2.3 系统级别 3 变量名称 4 变量的转译 4.1 转译 4.2 声明 4.3 变量 ...

最新文章

  1. 物联网安全只有最薄弱的环节才有保障
  2. redis python zset
  3. windows配置maven环境并换源
  4. [Java]Object有哪些公用方法?
  5. 推荐系统笔记(信息消费)
  6. 58金融产品经理董宁:互金产品设计21问
  7. 人工神经网络之激活函数总结
  8. Spring Data Solr教程:CRUD(差不多)
  9. matlab斜杠报错,java调用matlab 时出现java.lang.NullPointerException错误
  10. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
  11. asp.net 页面转向 Response.Redirect, Server.Transfer, Server.Execute的区别
  12. mysql 删除foreign key_MySQL-Foreign Key
  13. MySQL数据表类型及文件结构
  14. vue开发中v-for在Eslint的规则检查下出现:Elements in iteration expect to have 'v-bind:key' directives...
  15. sshv2 mitm工具jmitm2的使用记录
  16. 新手如何学习网络安全?
  17. android 设内网固定ip,如何给手机设置一个固定的内网ip
  18. 真爱,就要失去自己?
  19. 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了
  20. 微信分享服务器,微信分享的链接会被腾讯后台先访问

热门文章

  1. 基于激光雷达构建高精度点云地图及其感知定位
  2. S4D440-Custom Code Adaption for SAP S/4HANA-笔记
  3. Redis的配置文件redis.conf的解析
  4. [高数]e^x(sinx)^2的不定积分
  5. Neeto - 我所期待的MD编辑器
  6. 三、仪表读数识别算法的开发——1. 整体思路
  7. bartender的api帮助_在浏览器中通过bartender,调用条码打印机的active控件代码的实现...
  8. 《统计学》——思考题第八章假设检验(贾俊平)
  9. hooker pro入门文档
  10. 搭建Prometheus配置企业微信告警