Shell脚本

shell 脚本是一种更加复杂度的工具。

大多数shell都有自己的一套脚本语言,包括变量、控制流和自己的语法。shell脚本

与其他脚本语言不同之处在于,shell 脚本针对 shell 所从事的相关工作进行来优化。

因此,创建命令流程(pipelines)、将结果保存到文件、从标准输入中读取输入,这些

都是 shell 脚本中的原生操作,这让它比通用的脚本语言更易用。本节会专注于bash脚本

因为它最流行,应用更为广泛。

在bash中为变量赋值的语法是foo=bar,访问变量中存储的数值,其语法为 $foo。

需要注意的是,foo = bar (使用空格隔开)是不能正确工作的,因为解释器会调用程序foo

将 = 和 bar作为参数。 总的来说,在shell脚本中使用空格会起到分割参数的作用,

有时候可能会造成混淆,请务必多加检查。

在Bash中单引号和双引号都是定义字符串的

,但是以单引号定义的字符串为原始字符串,其中的变量不会被转义,而

双引号定义的字符串会将变量值进行替换

[root@localhost ~]# test=shell_bash
[root@localhost ~]# echo "$test"
shell_bash
# 打印 shell_bash
[root@localhost ~]# echo '$test'
$test
# 打印 $test

同样bash也支持if,case,while,和for这些控制流关键字

同样地, bash 也支持函数,它可以接受参数并基于参数进行操作。

mcd(){
mkdir -p "$1"
cd "$1"
}

这里 $1 是脚本的第一个参数。与其他脚本语言不同的是,bash使用了很多特殊的变量来表示参数、错误代码和相关变量。

$0 - 脚本名
$1 到 $9 - 脚本的参数。 $1 是第一个参数,依此类推。
$@ - 所有参数
$# - 参数个数
$? - 前一个命令的返回值
$$ - 当前脚本的进程识别码
!! - 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !!再尝试一次。
$_ - 上一条命令的最后一个参数。如果你正在使用的是交互式 shell,你可以通过按下 Esc 之后键入 . 来获取这个值。

命令通常使用 STDOUT来返回输出值,使用STDERR 来返回错误及错误码,便于脚本以更加友

好的方式报告错误。 返回码或退出状态是脚本/命令之间交流执行状态的方式。返回值0表示

正常执行,其他所有非0的返回值都表示有错误发生

退出码可以搭配 &&(与操作符)和 ||(或操作符)使用,用来进行条件判断,决定是否执

行其他程序。它们都属于短路运算符(short-circuiting) 同一行的多个命令可以用 ;

分隔。程序 true 的返回码永远是0,false 的返回码永远是1。让我们看几个例子

例子

#!/bin/bash

echo "Starting program at $(date)"
# date会被替换成日期和时间
echo "Running program $0 with $# arguments with pid $$" for file in "$@";do
grep foobar "$file" > /dev/null 2> /dev/null
# 如果模式没有找到,则grep退出状态为 1
# 我们将标准输出流和标准错误流重定向到Null,因为我们并不关心这些信息
if [[ $? -ne 0 ]]; then
echo "File $file does not have any foobar, adding one"
echo "# foobar" >> "$file"
fi
done

shell的 通配(globbing)

  • 通配符 - 当你想要利用通配符进行匹配时,你可以分别使用 ? 和 * 来匹配一个或任意个字符。

    例如,对于文件foo, foo1, foo2, foo10 和 bar, rm foo?这条命令会删除foo1 和 foo2 ,

    而rm foo* 则会删除除了bar之外的所有文件。

  • 花括号{} - 当你有一系列的指令,其中包含一段公共子串时,

    可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便。

例如:

convert image.{png,jpg}
# 会展开为
convert image.png image.jpg # 也可以配合通配符使用
mv *{.py,.sh} folder
# 会移动所有 *.py 和 *.sh 文件 mkdir foo bar

Shell工具

查看命令如何使用

最常用的方法是为对应的命令行添加-h 或 --help 标记。

另外一个更详细的方法则是使用man 命令。man 命令是手册(manual)的缩写,

它提供了命令的用户手册。

查找文件

所有的类UNIX系统都包含一个名为 find 的工具,

它是 shell 上用于查找文件的绝佳工具。

find命令会递归地搜索符合条件的文件。

例如:

# 查找所有名称为src的文件
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'

查找代码

UNIX的系统都提供了grep命令,它是用于对输入文本进行匹配的通用工具。

grep 有很多选项,这也使它成为一个非常全能的工具。

其中我经常使用的有 -C :获取查找结果的上下文(Context);

-v 将对结果进行反选(Invert),也就是输出不匹配的结果。

举例来说, grep -C 5 会输出匹配结果前后五行。

当需要搜索大量文件的时候,使用 -R 会递归地进入子目录并搜索所有的文本文件。

查找shell命令

history 命令允许您以程序员的方式来访问shell中输入的历史命令。

这个命令会在标准输出中打印shell中的里面命令。

如果我们要搜索历史记录,则可以利用管道将输出结果传递给 grep 进行模式搜索。

history | grep find 会打印包含find子串的命令。

shell工具和脚本的更多相关文章

  1. 主题 2 Shell工具和脚本

    主题 2 Shell工具和脚本 Shell 工具和脚本 · the missing semester of your cs education (missing-semester-cn.github. ...

  2. 生产力工具:shell 与 Bash 脚本

    生产力工具:shell 与 Bash 脚本 作者:吴甜甜 个人博客网站: wutiantian.github.io 注意:本文只是我个人总结的学习笔记,不适合0基础人士观看. 参考内容: 王顶老师 l ...

  3. Shell 脚本(五) Shell 工具 及 企业面试题

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 十.Shell工具(重点) 1.cut cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的. ...

  4. linux shell工具集合

    1)判断进程是否存在,如果不存在再执行启动命令,可以避免一个脚本同时启动多份 if [ $(ps -ef |grep  bastion_account.sh|grep -v grep|wc -l) - ...

  5. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  6. Shell工具| 流程控制

    1. 流程控制 if 判断 ()[ 条件判断式 ],中括号和条件判断式之间必须有空格 ()if后要有空格 [kris@hadoop datas]$ vim if.sh #!/bin/bash -eq ...

  7. ipython是python的交互式shell工具

    ipython: 是python的交互式shell工具,比默认的python shell工具要好用.支持变了自动补全,自动缩进,内置了很多的功能和函数 启动:可以通过cmd来启动该工具 自动补全: I ...

  8. Shell编程(脚本)的经常使用命令和语句

    一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...

  9. -Shell 教程 Bash 脚本 基础语法 MD

    目录 目录 Shell 简介 Shell 脚本 Shell 环境 第一个shell脚本 Shell 变量 定义变量 使用变量 只读变量 删除变量 Shell 字符串 单引号 双引号 字符串基本操作 S ...

  10. VPS性能测试shell工具以及锐速安装

    比较熟悉的UnixBench非常耗费资源,需要长时间跑满cpu和IO,很多主机商都深恶痛绝,会做各种限制,其实也代表不了实际使用的业务效果,毕竟真正需要那么多cpu和IO的应用并不多.而网络状况却是大 ...

随机推荐

  1. C# 动态创建类,动态创建表,支持多库的数据库维护方案

    1.创建表 SqlSugar支持了3种模式的建表,非常的灵活,可以MYSQL MSSQL ORACLE等用同一语法创建数据库,不需要考虑数据库的兼容性 中间标准: string  大文本 5.1.3. ...

  2. Ubuntu18.04二进制安装elasticsearch

    1. 什么是Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎.Logstash 和 Beats 有助于收集.聚合和丰富您的数据并将 ...

  3. DevOps 在未来将如何演进?丨行业观察

    自2007年 DevOps 这一概念推出以来,越来越多企业开始将开发和运维团队结合在一起,以加快部署速度,提高软件开发生命周期的效率和协作.但是,诸多因素都会对 DevOps 是否成功产生影响,例如组 ...

  4. Win11右键菜单改回传统样式

    Win11右键菜单,比较不人性化,隐藏了一些常用选项,需要点"更多选项"才能显示,多次一举. 解决方法,一句话: reg.exe add "HKCU\Software\C ...

  5. Unity C# IEnumrator 与 async 有的区别

    前言 IEnumerator 和 async 是在 Unity 和 C# 中处理异步编程的两种不同方法.它们各自有不同的使用场景和优缺点. IEnumerator IEnumerator 是 C# 中 ...

  6. [Linux]常用命令之【top/uptime/w/vmstat/free】

    1 top 语法:top [-s time] [-d count] [-q] [-u] [-h] [-n number] [-f filename] -s time 设置屏幕刷新的延时,单位为秒,默认 ...

  7. day118:MoFang:根据激活/未激活的状态分别显示树桩&种植植物&解锁树桩&化肥/修剪/浇水/宠物粮小图标数字的显示

    登录 1.根据激活状态和未激活状态分别显示树桩 2.用户使用植物道具进行果树种植 3.解锁树桩 4.化肥/修剪/浇水/宠物粮小图标显示 种植栏的功能实现 1. 客户端需要的植物相关参数: 总树桩数量, ...

  8. TF-IDF定义及实现

    TF-IDF定义及实现 定义 ​ TF-IDF的英文全称是:Term Frequency - Inverse Document Frequency,中文名称词频-逆文档频率,常用于文本挖掘,资讯检索等 ...

  9. 从 1 秒到 10 毫秒!在 APISIX 中减少 Prometheus 请求阻塞

    本文介绍了 Prometheus 插件造成长尾请求现象的原因,以及如何解决这个问题. 作者屠正松,Apache APISIX PMC Member. 原文链接 现象 在 APISIX 社区中,曾有部分 ...

  10. SPI-SPI主机硬件片选功能使用说明

    SPI主机硬件片选功能使用说明 SPI协议最早的标准,是由摩托罗拉公司制定.在协议使用的过程中,根据实际需求可能会进行一些扩展和修改. 在一份由飞思卡尔半导体发布的SPI V4.01版本规范中,对片选 ...