10.编写Shell脚本(1)

1.shell的组成

  1. 脚本声明         #!/bin/bash
  2. 脚本注释        以#开头
  3. 脚本命令        实现脚本的功能

2.分类

交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shel会一次性执行脚本中诸多的命令

shell脚本文件,建议将.sh后缀加上, 以表示是一个脚本文件。 

3.运行脚本的方法

  1. Bash解释器命令直接运行Shell脚本文件
  2. 通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚 本文件增加执行权限即可

4.编写简单的脚本

查看当前所在工作路径并列出当前目录下所有的文件及属性信息

[root@localhost ~]# cat cat.sh
#!/bin/bash
#查看当前所在工作路径并列出当前目录下所有的文件及属性信息
pwd
ls -al
[root@localhost ~]#  bash cat.sh
/root
total 2097256
dr-xr-x---. 22 root root       4096 Jan 21 10:20 .
dr-xr-xr-x. 18 root root        235 Jan 20 16:34 ..
-rw-r--r--.  1 root root        312 Jan 19 18:58 111
drwxr-xr-x.  2 root root          6 Jan 19 11:41 123
drwxr-xr-x.  2 root root          6 Jan 19 11:24 2
[root@localhost ~]# ./cat.sh
-bash: ./cat.sh: Permission denied
[root@localhost ~]# chmod +x cat.sh
[root@localhost ~]# ./cat.sh
/root
total 2097256
dr-xr-x---. 22 root root       4096 Jan 21 10:20 .
dr-xr-xr-x. 18 root root        235 Jan 20 16:34 ..
-rw-r--r--.  1 root root        312 Jan 19 18:58 111
drwxr-xr-x.  2 root root          6 Jan 19 11:41 123

5.接收用户的参数

shell脚本内设了用于接收参数的变量,变量之间使用空格间隔。

$0 对应的是当前 Shell 脚本程序的名称,

$#对应的是总 共有几个参数,

$*对应的是所有位置的参数值,

$?对应的是显示上一次命令的执行返回值,

而$1、$2、$3……则分别对应着第N个位置的参数值 

[root@localhost ~]# cat example.sh
#!/bash/sbin
#接收用户的参数
echo "当前脚本的名字是:$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第五个参数为$5"[root@localhost ~]# bash example.sh one two three four five six
当前脚本的名字是:example.sh
总共有6个参数,分别是one two three four five six
第一个参数为one,第五个参数为five
[root@localhost ~]#

6.判断用户的参数

        Shell脚本中的条 件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回非零值。切记,条件表达式两边均应有一个空格。

 按照测试对象来划分,条件测试语句可以分为4种:

  1. 文件测试语句

-d 测试文件是否为目录类型

-e 测试文件是否存在

-f 判断是否为一般文件

-r 测试当前用户是否有权限读取

-w 测试当前用户是否有权限写入

-x 测试当前用户是否有权限执行

        使用文件测试语句来判断/etc/是否为一个目录类型的文件,  然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。

        如果返回值为0,则目录存在;如果返回值 为非零的值,则意味着它不是目录,或这个目录不存在:

[root@localhost ~]# [ -d /etc ]
[root@localhost ~]# echo $?
127

使用文件测试语句来判断/etc是否为一般文件,如果返回值为 0,则代表文件存 在,且为一般文件: 

[root@localhost ~]# [ -f /etc ]
[root@localhost ~]# echo $?
1

逻辑测试语句

 逻辑与

        在Shell 终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令, 因此可以用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样。

[root@localhost ~]#  [ -e /dev/cdrom ] && echo "Exist"
Exist

 逻辑或

逻辑“或”,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量USER来判断当前 登录的用户是否为非管理员身份:

[trick@localhost ~]$ [ $USER = root ] || echo user
user

逻辑非

        逻辑“非”,在Linux系统中的运算符号是一个叹号(!),它表示把条件测 试中的判断结果取相反值。

!真=假

!假=真

        如果原本测试的结果是正确的,则将其变成错误的; 原本测试错误的结果,则将其变成正确的。

        现在切换回到root管理员身份,再判断当前用户是否为一个非管理员的用户。由于 判断结果因为两次否定而变成正确,因此会正常地输出预设信息:

[root@localhost ~]# echo $USER
root
[root@localhost ~]#  [ ! $USER = root ] || echo "administrator"
administrator

        当前登录用户root,先判断当前 登录用户的USER 变量名称是否等于root,

        然后用逻辑“非”运算符进行取反操作,效果就 变成了判断当前登录的用户是否为非管理员用户。

        最后若条件成立,则会根据逻辑“与”运 算符输出user字样;

        若条件不满足,则会通过逻辑“或”运算符输出root字样,而只有在前面的&&不成立时才会执行后面的||符号。

[root@localhost ~]#  [ ! $USER = root ] && echo "user" || echo "root"
root

整数值比较语句

        整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作

                                                可用的整数比较运算符        

-eq 是否等于

-ne 是否不等于

-gt 是否大于

-lt 是否小于

-le 是否等于或小于

-ge 是否大于或等于

10是否大于10以及10是否等于10

[root@localhost ~]# [ 10 -eq 10 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ 10 -gt 10 ]
[root@localhost ~]# echo $?
1

        输出系统剩余内存

        先使用free -m命令查看内存使用量情况(单位为MB),然后通过“grep Mem:”命令 过滤出剩余内存量的行,再用awk '{print $4}'命令只保留第4列。

[root@localhost ~]# free -mtotal        used        free      shared  buff/cache   available
Mem:           1966         979         376          10         610         799
Swap:          2047           0        2047
[root@localhost ~]# free -m | grep Mem | awk '{ print $4}'
376

        建议把输出结果赋值给一个变量,以方便其 他命令进行调用:

[root@localhost ~]#  FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@localhost ~]# echo $FreeMem
362

使用整数运算符来判断内存可用量的值是否小于1024,若小 于则会提示内存不足的字样:

[root@localhost ~]#  [ $FreeMem -lt 1024 ] && echo "内存不足"
内存不足

字符串比较运算符

        用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来 判断某个变量是否未被定义(即内容为空值)

= 比较字符串内容是否相同

!= 比较字符串内容是否不同

-z 判断字符串内容是否为空

来通过判断Trick变量是否为空值,进而判断是否定义了这个变量:

[root@localhost ~]# [ -z $Trick ]
[root@localhost ~]# echo $?
0

        当用于保存当前语系的环境变量值LANG不是英语 (en.US)时,则会满足逻辑测试条件并输出“不是英语”的字样:

[root@localhost ~]# [ ! $LANG = "en.US" ] && echo "不是英语"
不是英语
[root@localhost ~]#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/421650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS开源软件Notice收集策略说明

开源软件Notice是与项目开源相关的文件,收集这些文件的目的是为了符合开源的规范。 收集目标 只收集打包到镜像里面的模块对应的License;不打包的都不收集,比如构建过程使用的工具(如clang、python、ninja等)都是不收…

第91讲:MySQL主从复制集群主库与从库状态信息的含义

文章目录 1.主从复制集群正常状态信息2.从库状态信息中重要参数的含义 1.主从复制集群正常状态信息 通过以下命令查看主库的状态信息。 mysql> show processlist;在主库中查询当前数据库中的进程,看到Master has sent all binlog to slave; waiting for more u…

侧面车窗透明屏显示方案

侧面车窗透明屏显示方案是一种新型的汽车显示技术,其基本原理是在汽车侧窗玻璃上投射显示内容,从而在不影响驾驶员视线的情况下,提供额外的信息和娱乐。 该方案通常采用柔性OLED显示技术,因为柔性OLED具有轻薄、可弯曲的特性&…

Vue3组件库开发 之Button(2) 未完待续

Vue3组件库开发 之Button(1) 中新建项目,但未安装成功ESLINT 安装ESLINT npm install eslint vite-plugin-eslint --save-dev 安装eslint后,组件文件出现错误提示 添加第三方macros ,虽然不是官网但很多开发者都是vue3开发人员 安装macros…

【Java】Maven的基本使用

Maven的基本使用 Maven常用命令 complie:编译clean:清理test:测试package:打包install:安装 mvn complie mvn clean mvn test mvn package mvn installMaven生命周期 IDEA配置Maven Maven坐标 什么是坐标?…

qnx 上screen + egl + opengles 最简实例

文章目录 前言一、qnx 上的窗口系统——screen二、screen + egl + opengles 最简实例1.使用 addvariant 命令创建工程目录2. 添加源码文件3. common.mk 文件4. 编译与执行总结参考资料前言 本文主要介绍如何在QNX 系统上使用egl和opengles 控制GPU渲染一个三角形并显示到屏幕上…

Mysql运维篇(三) MySQL数据库分库分表方案

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人,如有侵权请留言,我及时删除。 一、前言 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数…

安装ddddocr中遇到的问题

1、需要先安装: pip3 install pyinstaller --no-use-pep517 pip install scikit-build pip install setuptools pip install pyinstaller pip install pillow 重要是的是保证一个python 环境,多个python环境会导致各种问题。并且保证python>3.8…

[数据结构 - C++] 红黑树RBTree

文章目录 1、前言2、红黑树的概念3、红黑树的性质4、红黑树节点的定义5、红黑树的插入Insert6、红黑树的验证7、红黑树与AVL树的比较附录: 1、前言 我们在学习了二叉搜索树后,在它的基础上又学习了AVL树,知道了AVL树是靠平衡因子来调节左右高…

双指针算法专题

前言 双指针算法入门,干就完了 下面的题目都是来自灵神的基础算法精讲,有思路不清晰的地方,可以去看讲解。 灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频 (bilibili.com) 相向双指针 1.两数之和 题目链接:167. 两数之…

vue3跨域请求及一些常用配置

在使用vue3开发的时候,总免不了做一些基础的配置。比如跨域配置,一些常用函数的封装等等。接下来,我就做一些自己在在开发中所运用到一些常用配置。 一、跨域配置 其实,对于跨域配置,我之前的博文中也有说过&#xff0…

Python Web 开发之 Flask 入门实践

导语:Flask 是一个轻量级的 Python Web 框架,广受开发者喜爱。本文将带领大家了解 Flask 的基本概念、搭建一个简单的 Web 项目以及如何进一步扩展功能。 一、Flask 简介 Flask 是一个基于 Werkzeug 和 Jinja2 的微型 Web 框架,它的特点是轻…