2.shell工具与脚本

article/2025/11/7 18:33:23

文章目录

  • 一、bash 中的特殊变量
  • 二、变量赋值与访问
  • 三、其他类型的脚本
  • 四、查找文件
      • find
      • locate
    • 查找内容
      • grep
    • 查找 shell 命令
    • tree broot
  • 五、零碎知识点
  • 六、 shell工具


一、bash 中的特殊变量

$0 :脚本名
$1 -$9 :脚本的第1-9个参数
$@ :脚本的所有参数
$# :参数个数
$? :前一条命令的返回值
$_ :前一条命令的最后一个参数
!! :完整的前一条命令 ;常见应用:应权限不足而执行命令失败时,可用 sudo !!
$$ : 当前脚本的进程识别码
完整变量列表

使用方法:
1.用 “$1” 代表输入的第一个参数(记得加双引号,单引号不行)
2. 命令行sudo等 可直接使用

二、变量赋值与访问

普通赋值: foo=bar (注意不能有空格,空格默认用来分隔命令与命令参数)
访问: $foo 访问foo的值

(注意 echo “$foo” 需要加双引号来区别于字符$foo )
echo “hello $foo” 输出:hello bar

echo ‘hello $foo’ 输出:hello $foo

返回码可为变量赋值 ,
如:foo=$(pwd) ;

三、其他类型的脚本

脚本并不一定只有用 bash 写才能在终端里调用。比如说,这是一段 Python 脚本,作用是将输入的参数倒序输出:

#!/usr/local/bin/python
import sys
for arg in reversed(sys.argv[1:]):print(arg)

内核知道去用 python 解释器而不是 shell 命令来运行这段脚本,是因为脚本的开头第一行的 shebang
也可以使用env命令: #!/usr/bin/env python 更通配(两种方式的不同)env介绍
shell函数和脚本有如下一些不同点:

函数只能与shell使用相同的语言,脚本可以使用任意语言。因此在脚本中包含 shebang 是很重要的。
函数仅在定义时被加载,脚本会在每次被执行时加载。这让函数的加载比脚本略快一些,但每次修改函数定义,都要重新加载一次。
函数会在当前的shell环境中执行,脚本会在单独的进程中执行。因此,函数可以对环境变量进行更改,比如改变当前工作目录,脚本则不行。脚本需要使用 export 将环境变量导出,并将值传递给环境变量。
与其他程序语言一样,函数可以提高代码模块性、代码复用性并创建清晰性的结构。shell脚本中往往也会包含它们自己的函数定义。

四、查找文件

find

所有的类UNIX系统都包含一个名为 find 的工具,它是 shell 上用于查找文件的绝佳工具。find命令会递归地搜索符合条件的文件,例如:
(如果您希望模式匹配时是不区分大小写,可以使用-iname选项)

除了列出所寻找的文件之外,find 还能对所有查找到的文件进行操作。这能极大地简化一些单调的任务。

# 删除全部扩展名为.tmp 的文件
find . -name '*.tmp' -exec rm {} \;
# 查找全部的 PNG 文件并将其转换为 JPG
find . -name '*.png' -exec convert {} {}.jpg \;

尽管 find 用途广泛,它的语法却比较难以记忆。fd 就是一个更简单、更快速、更友好的程序,它可以用来作为find的替代品。它有很多不错的默认设置,例如输出着色、默认支持正则匹配、支持unicode并且我认为它的语法更符合直觉。以模式PATTERN 搜索的语法是 fd PATTERN。

locate

locate 使用一个由 updatedb负责更新的数据库,在大多数系统中 updatedb 都会通过 cron 每日更新。这便需要我们在速度和时效性之间作出权衡。而且,find 和类似的工具可以通过别的属性比如文件大小、修改时间或是权限来查找文件,locate则只能通过文件名。 这里有一个更详细的对比。
手动更新: updatedb

查找内容

grep

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

 -C :获取查找结果的上下文(Context);-v 将对结果进行反选(Invert),也就是输出不匹配的结果。举例来说, grep -C 5 会输出匹配结果前后五行。当需要搜索大量文件的时候,使用 -R 会递归地进入子目录并搜索所有的文本文件。

但是,我们有很多办法可以对 grep -R 进行改进,例如使其忽略.git 文件夹,使用多CPU等等。

因此也出现了很多它的替代品,包括 ack, ag 和 rg。它们都特别好用,但是功能也都差不多,我比较常用的是 ripgrep (rg) ,因为它速度快,而且用法非常符合直觉。例子如下:

# 查找所有使用了 requests 库的文件
rg -t py 'import requests'
# 查找所有没有写 shebang 的文件(包含隐藏文件)
## -u:不忽略隐藏文件  “^#!” 正则表达式  -t sh :只查找.sh文件
rg -u --files-without-match "^#\!" -t sh# 查找所有的foo字符串,并打印其之后的5行
rg foo -A 5
# 打印匹配的统计信息(匹配的行和文件的数量)
rg --stats PATTERN
与 find/fd 一样,重要的是你要知道有些问题使用合适的工具就会迎刃而解,而具体选择哪个工具则不是那么重要。

查找 shell 命令

目前为止,我们已经学习了如何查找文件和代码,但随着你使用shell的时间越来越久,您可能想要找到之前输入过的某条命令。首先,按向上的方向键会显示你使用过的上一条命令,继续按上键则会遍历整个历史记录。

history 命令允许您以程序员的方式来访问shell中输入的历史命令。这个命令会在标准输出中打印shell中的里面命令。如果我们要搜索历史记录,则可以利用管道将输出结果传递给 grep 进行模式搜索。
history 1 打印从开始到此刻输入的所有命令
history | grep find 会打印包含find子串的命令。

对于大多数的shell来说,您可以使用 Ctrl+R 对命令历史记录进行回溯搜索。敲 Ctrl+R 后您可以输入子串来进行匹配,查找历史命令行。

反复按下就会在所有搜索结果中循环。

Ctrl+R 可以配合 fzf 使用。fzf 是一个通用对模糊查找工具,它可以和很多命令一起使用。这里我们可以对历史命令进行模糊查找并将结果以赏心悦目的格式输出。

另外一个和历史命令相关的技巧我喜欢称之为基于历史的自动补全。 这一特性最初是由 fish shell 创建的,它可以根据您最近使用过的开头相同的命令,动态地对当前对shell命令进行补全

你可以修改 shell history 的行为,例如,如果在命令的开头加上一个空格,它就不会被加进shell记录中。当你输入包含密码或是其他敏感信息的命令时会用到这一特性。 为此你需要在.bashrc中添加HISTCONTROL=ignorespace或者向.zshrc 添加 setopt HIST_IGNORE_SPACE。 如果你不小心忘了在前面加空格,可以通过编辑.bash_history或 .zhistory 来手动地从历史记录中移除那一项。

tree broot

二者均可以直观的形式打印多级目录(ls -R 不够形象)(broot功能更多)
在这里插入图片描述

五、零碎知识点

  1. 同一行 用 ; 分隔不同命令
  2. && || 的短路效果
  3. 返回码可于&& || 搭配使用,如: false || echo “”
  4. 返回码可为变量赋值 ,如:foo=$(pwd)
  5. 命令替换

$ echo “We are in $(pwd)”
We are in /sys/class/power_supply/ACAD

  1. 进程替换
    <(命令) :将命令的输出写入临时文件

$ cat <(ls) <(ls …)
Desktop
Documents
Downloads
Pictures
program
Public
Templates
Videos
zzxy

  1. vim
  2. grep :在文件中捕捉特定字符串(print lines that match patterns)

grep [OPTION…] PATTERNS [FILE…]
grep searches for PATTERNS in each FILE
grep -r 递归搜索文件夹
grep 不给出文件则在input中搜索
file 参数中 ‘-’ 表示stdin

  1. 通配符:

? 单字符通配:foo? 会匹配foo1,foo2,但不会匹配foo11
* 不限字符通配:foo*匹配所有foo开头的字符
应用 : ls *.sh
花括号{}:
convert image.{png,jpg} 会展开为
convert image.png image.jpg
#下面命令会创建foo/a, foo/b, … foo/h, bar/a, bar/b, … bar/h这些文件
touch {foo,bar}/{a…h}

六、 shell工具

shellcheck :帮助你快速找到脚本中的错误

用法: shellcheck 【file】 (file是待检查的脚本文件名)

TLDR pages
有时候手册内容太过详实,让我们难以在其中查找哪些最常用的标记和语法。TLDR pages是一个很不错的替代品,它提供了一些案例,可以帮助您快速找到正确的选项。

用法:tldr 命令


http://chatgpt.dhexx.cn/article/gIQKJ8BN.shtml

相关文章

Linux---Shell(文本处理工具 和 Shell脚本)

目录 一、文本处理工具 1.1 grep 1.1.1 匹配行首 1.1.2 设置大小写 1.1.3 转义字符 1.2 sed 1.2.1 追加文件 1.2.2 删除文本 1.3 awk 1.3.1 关系表达式 二、Shell脚本 2.1 结构判断 2.2 循环结构 2.3 break 和 continue 2.4 Shell脚本的基本元素与执行方式 一、文…

shell

shell 什么是shell&#xff1a; 现在我们使用的操作系统&#xff08;Windows、Mac OS、Android、iOS等&#xff09;都是带图形界面的&#xff0c;简单直观&#xff0c;容易上手&#xff0c;对专业用户&#xff08;程序员、网管等&#xff09;和普通用户&#xff08;家庭主妇、…

shell的几种常用工具

最近在学习shell脚本语言&#xff0c;在学习的过程中了解了关于shell的几种常用工具&#xff0c;就总结了一下。 1、sort 功能&#xff1a;顾名思义&#xff0c;sort是对文本进行排序操作的。原则&#xff1a;sort将文件的每一行作为一个单位&#xff0c;相互比较&#xff0c…

Linux学习 -- Shell的工具

cutsedawksort Shell提供的工具可以帮助我们更快的完成需求操作。 一、cut 功能描述&#xff1a; cut的工作就是"剪"&#xff0c;具体是用来在文件中负责剪切数据。cut 命令从文件的每一行剪切字节、字符和字段并将这些文字、字符和字段输出。 基本用法&#xff1a; …

快速入门Shell脚本(5)——Shell的这些工具你都知道了吗?

上一篇博客已经给大家讲了计较复杂的操作&#xff08;常用的函数操作&#xff09;。 本篇博客&#xff0c;给讲一下shell的工具&#xff0c;学会写工具会让你的面试加分的偶。&#xff08;喜欢shell脚本的可以关注专栏&#xff09; 1.Shell中的cut 1.1介绍 cut的工作就是“剪…

Shell常用命令与工具

学习一些在编写Shell时的常用命令或工具及使用技巧。有人说Shell脚本是命令堆积的一个文件&#xff0c;按顺序去执行。还有人说想学好Shell脚本&#xff0c;要把Linux上各种常见的命令或工具掌握了&#xff0c;这些说法都没错。由于Shell语言本身在语法结构上比较简单&#xff…

SHELL工具推荐

随着个人使用还会继续更新&#xff0c;目前就只有两款。 1.Xshell 业界较常见的一款经典的shell命令行软件&#xff0c;配套有单独的ftp软件。 界面比较简洁&#xff0c;命令好像全是单色。有开源的免费版本可以下载。 2.MobaXterm 界面易读性高很多&#xff0c;对于warning、…

shell脚本之工具

在学习了shell脚本的基本语法,命令,符号之后,接下来要看的就是shell脚本使用的所有工具了。 在shell脚本中,工具的使用简化了所要编写的代码。接下来就介绍几个shell下经常使用的工具。 1、sort sort工具的常用语法就是将文件的每一行作为一个单位,相互比较,比较原则是从…

shell之常用工具(cut、sort、uniq、tr)

文章目录 一、列截取工具-cut1、cut概述2、常用选项3、案例演示 二、排序工具-sort1、sort概述2、常用选项3、案例演示 三、去重工具-uniq1、uniq概述2、uniq的常用选项3、案例演示 四、修改工具-tr1、 tr概述2、tr的常用选项3、案例演示 五、面试题六、总结 一、列截取工具-cu…

JDK配置环境变量+eclipse安装使用(保姆级教程)

一、下载JDK 访问Oracle官网下载最新版JDKJava Downloads | Oracle&#xff0c;也可点击此处下载我准备的安装包。 以Windows系统举例&#xff0c;选择Windows下的第二个&#xff08;第一个为压缩包&#xff0c;第二个为安装程序&#xff0c;第三个是Windows Installee的数据包…

eclipse android环境搭建,Eclipse Android开发环境搭建教程

Eclipse Android开发环境搭建教程是本文要介绍的内容&#xff0c;主要是来了解并学习Eclipse Android环境搭建的过程&#xff0c;具体关于Eclipse Android内容的详解来看本文。 Eclipse Android开发准备&#xff1a; 1、javasdk 2、eclipsehttp://www.eclipse.org/downloads/ 3…

AWS Toolkit for Eclipse环境配置

最近&#xff0c;实验室的工作中涉及到了AWS&#xff0c;拟采用Java来实现。现在来整理一下相关配置过程。 配置过程 首先&#xff0c;我这里使用的是Eclipse Oxygen版本。AWS Toolkit for Eclipse的安装过程比较简单&#xff0c;在Eclipse的菜单栏点击“Help->Install New…

eclipse配置java环境_java环境搭建(Eclipse)

1.打开Eclipse官网 2.单击Download下方的灰色字Download Packages 3.单机图片中Eclipse IDE for Enterprise Java Developers 中的对应选项(windows 64-bit) 4.跳出窗口后点击橙色Download 5.解压下载下来的解压包 6.打开解压后文件夹中的eclipse.exe 7.如果出现该问题贼需要搭…

java web(eclipse)搭建环境

开发环境搭建&#xff1a; 一、搭建jdk环境&#xff1a;&#xff08;配置环境变量&#xff0c;JAVA_HOME,PATH,CLASSPATH,JRE_HOME&#xff09; a) 参考链接&#xff1a;https://jingyan.baidu.com/article/1974b28959d87ff4b0f7745c.html 二、下载解压eclipse&#xff1a;绿色…

eclipse的安装与环境配置

一&#xff0c;eclipse下载 地址&#xff1a;https://www.eclipse.org/downloads/ 一般浏览器都有翻译功能 二、有32位和64位的版本根据自己的需求下载&#xff0c;选下载的选下载量最多的下载。 1.下载完成后是压缩包解压 就可以直接使用 这样子eclipse就下载好了,接下来就…

Eclipse配置Android开发环境

Eclipse配置Android开发环境 环境变量的配置测试环境是否配置完毕 ADT插件的安装ADT的下载在线安装&#xff08;未试成功&#xff09;离线安装 ADT的使用 eclipse新建Android项目xml文件无法预览页面 在配置好环境的eclipse中安装Android SDK&#xff08;Software Development …

Eclipse配置python环境全步骤

安装方法参考这一博主的文章&#xff0c;一开始选用第二、三种&#xff0c;都安装失败 eclipse配置python开发环境_如何在Eclipse中配置python开发环境_weixin_39827036的博客-CSDN博客 后面用第一种方法&#xff0c;还是在 Window-preferences 下没有找到 PyDev 然后看到这…

配置Eclipse环境变量

不管是eclipse还是MyEclipse 都需要配置环境变量&#xff0c;MyEclipse不配置好环境变量是不能用激活破解工具的 方法&#xff1a; &#xff08;右键&#xff09;我的电脑&#xff0d;(右键)“属性”&#xff0d;高级&#xff0d;环境变量&#xff0c;弹出Windows的“环境变量…

eclipse搭建mybatis的环境

1.首先创建一个web工程 2.导入mybatis的jar包 3.创建一个xxx.properties文件里面写 &#xff08;1&#xff09;我这里是mysql 8 如果是mysql5&#xff0c;driver就不一样 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/mybbs?serverTimezoneAs…

Eclipse中配置python环境

1.首先将Eclipse下载完成 2.下载python模块&#xff0c;链接为&#xff08;https://sourceforge.net/projects/pydev/files/pydev/&#xff09;选择一个最新版本即可 3.之后得到python模块文件如下图&#xff0c;将两个文件夹复制一下 4.将两个文件夹内容复制到Eclipse的文件夹…