shell脚本之 Bash的常用命令

资源

100+最常用的Linux命令行大全

100+最常用的Linux命令行大全

使用 Linux 命令的 7 大技巧

  1. 了解你的 shell:Bash、zsh 还是 fish?不同的 shell 都有独特的功能。选择一个最适合你需要的。
  2. 掌握核心工具:ls, cat, grep, sed, awk, 等构成了 Linux 工具包的核心。
  3. 坚持使用管道:避免过多使用临时文件。巧妙地将程序管道化。
  4. 在覆盖前进行验证:在使用>>> 覆盖文件之前,一定要仔细检查。
  5. 跟踪工作流程:记录复杂的命令和工作流程,以便日后重复使用或共享。
  6. 自制工具:为经常执行的任务编写简单的 shell 脚本和别名。
  7. 不使用sudo启动:最初使用标准用户账户来了解权限。
    请记住,要不断在虚拟机或 VPS 服务器上测试新命令,以便在开始在生产服务器上使用这些命令之前,让它们成为你的第二天性。

0. Linux Shell 内部命令与外部命令

Shell 的内部(builtin)命令和外部命令

内部命令

内部命令实际上是Shell程序的一部分,由 Shell 软件内部进行实现的命令,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是Shell本身的重要组成部分。内部命令嵌入在Shell程序中,并不单独以磁盘文件的形式存在于磁盘上。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程,它们都运行在 Shell 进程当中。比如:exithistorycdechofgsourceexporttime等。

外部命令

外部命令是linux系统中的实用程序部分,是一个独立的外部可执行程序,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在Shell中,但是其命令执行过程是由Shell程序控制的。当外部命令被调用时,本质就是调用了另外一个程序,首先 Shell 会创建子进程,然后在子进程当中运行该程序。Shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin/usr/bin/sbin/usr/sbin等等。可通过“echo $PATH”命令查看外部命令的存储路径。常见外部命令比如:/bin/lsviteetar等。

为什么要分内部命令和外部命令

内部命令其实是SHELL程序的一部分,其中包含的是一些比较简练和日常经常会被用到的命令。这些命令通常系统启动时就调入内存,且常驻内存的,由SHELL程序识别并在SHELL程序内部运行,之所以这样做的原因只有一个就是:为了最大化执行效率,提升系统性能。而外部命令通常是系统的软件功能,该部分程序功能通常较为强大,但包括的程序量也很大,因此并不随系统启动一并加载,只在用户需要时才从硬盘中读入内存。

判断某个命令为外部命令或内部命令

type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令

type [-a | -t | -p] name

可能的输出为

命令 输出
lias 别名
keyword 关键字,Shell保留字
function 函数,Shell函数
builtin 内建命令,Shell内建命令
file 文件,磁盘文件,外部命令
unfound 没有找到

内部命令和外部命令的执行过程和顺序

因为内部命令是SHELL内置,所以该命令调用时直接使用,无需查找环境变量,而外部命令则有很大区别,因为外部命令若希望被用户所使用,要通过SHELL程序来调用,所以多了一层执行路径的问题,即我们常讲到的环境变量。

外部命令就是由Shell副本(新的进程)所执行的命令,基本的过程如下:

  • a. 建立一个新的进程。此进程即为Shell的一个副本。
  • b. 在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令。
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:为PATH变量典型的默认值。 当命令名称包含有斜杠(/)符号时,将略过路径查找步骤。
  • c. 在新的进程里,以所找到的新程序取代执行中的Shell程序并执行。
  • d. 程序完成后,最初的Shell会接着从终端读取下一条命令,和执行脚本里的下一条命令。

通常情况下,脚本中的Bash内建命令在运行的时候是不会fork出一个子进程的。但是脚本中的外部或者过滤命令通常会fork出一个子进程。 一个内建命令通常会与一个系统命令(外部命令)同名,但是Bash在内部重新实现了这些命令。比如,Bash的echo命令与/bin/echo就不尽相同,虽然它们的行为在绝大多数情况下都是一样的。

同理,如果我们内部命令对应的外部命令移动到系统环境变量之外的其它目录下或者删除掉。该命令其实仍然可以被执行的,因为其查找的顺序是内部命令->外部命令,看下面的这个小实验:

[%27%root@192 ~]# which cd
/usr/bin/cd  
## 外部cd二进制文件存放在该目录下
[%28%root@192 ~]# mv /usr/bin/cd /usr/bin/cd.move   ## 改名
[%29%root@192 ~]# cd /usr/   ## 改名后依然可以正常执行
[%30%root@192 /usr]# cd /root
[%31%root@192 ~]# type cd
cd is a shell builtin   ## cd 是内部命令

shell命令解释器在执行命令时,先尝试按照内部命令来执行,如果要执行的命令不是内部命令,则按照外部命令去查找对应的执行文件所在的目录,并执行。当要执行的命令不是内部命令时(例如ls),如果有两个ls指令分别在不同的目录中(例如/usr/local/bin/ls和/bin/ls),shell命令解释器就根据PATH里面哪个目录先被查询到,则那个目录下的命令就先被执行。

常见内部命令

SHELL中的内置命令约有60个,通过内置的enable命令即可查看所有的内部命令。

1. 输出命令 echo

echo "Hello world" echo 'Hello world!'

选项: -e 支持反斜线控制的字符转换

​ 可以通过通配符 支持16进制ASCII字符

​ 还可以输出颜色 echo -e "\e[1;31m abcd \e[0m"

ehco -e "\e[1;颜色命令 内容 \e[0m"

30m 黑色
31m 红色
32m 绿色
33m 黄色

写shell脚本的一个例子

#!/bin/sh
#Author: Gray

echo -e "\e[1;31m Nothing is more lamentable than a dead heart \e[0m"

注意第一步的注释,是有作用的,不仅是注释,而且会读取

这个真的是血泪史啊,我刚开始以为是 应该填绝对路径,以为是注释而已,原来它真的不是注释而已啊,应该不会有什么问题,后来发现原来真的必须写成#!/bin/sh不然就会出现如下错误

-bash: ./h.sh: /home/sh: bad interpreter: No such file or directory

这个#!/bin/bash表示我写的是一个shell脚本

2. 如何执行脚本

如果我把上面的脚本存为hello.sh,那么我如何执行这个脚本呢?

  • 方法一 赋予执行权限,直接运行

chmod 755 hello.sh 这样所有的用户都可以执行

可以使用绝对路径的方式来执行 /home/ubuntu/Luxcom/hello.sh的方式来执行

也可以用相对路径的方式来执行./hello.sh
** 一般情况下,Linux中所有的命令都必须使用绝对路径或者相对路径来执行**

  • 方法二 通过Bash调用执行脚本

    bash hello.sh 可以不用赋予权限

3. Windows和Linux的回车符的转换问题

通过 -A cat 文件名可以查看文件隐藏起来的回车符

Windows中的回车符是M$表示的,而Linux中的回车符是用$表示的,所以Linux中不能执行使用Windows编写的脚本,该如何处理这个问题

可以使用dos2unix [Windows下的文件]这条命令把windows下的文件的回车符转化为Linux下的回车符格式

这个命令需要安装

3. 历史命令 history

history [选项] [历史命令保存文件]

选项: -c 清空历史命令

-w 把缓存中的历史命令写入历史命令保存文件

历史命令默认保存1000条,这个条数可以修改

一些快捷键:

使用上、下箭头调用以前的历史命令

使用!n重复执行第n条历史命令

使用!!重复执行上一条命令

使用!字符串重复执行最后一条以该字符串开头的命令

4. 命令别名

alias 别名='原命令' 设定命令别名

alias 查询命令别名

命令执行顺序:

  1. 第一顺位执行用绝对路径或相对路径执行的命令
  2. 第二顺位执行别名
  3. 第三顺位执行Bash的内部命令
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

其实Linux中所有的命令都是需要使用绝对路径或者相对路径才能执行的,但是系统命令之所以能够不打绝对路径,是因为在Linux中有PATH环境变量,可以使用 echo $PATH 显示环境变量,Linux使用环境变量进行了简化操作

使用命令行设置的别名只能临时生效,重启之后会失效,如何才能使别名永久生效,需要写入配置文件.bashrc

5. 快捷键

ctrl + A 强制终止当前命令

ctrl + L 清屏,相当于clear

ctrl + U 删除或者剪切光标左侧的内容

ctrl + Y 粘贴ctrl + U 或者ctrl + K剪切的内容

ctrl + D 退出当前用户

6. 输入输出重定向

非常有用!一定要看此链接 Shell输入输出重定向

7. 多命令顺序执行与管道符

多命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与 当命令1正确执行,命令2才会执行
|| 命令1||命令2 逻辑或 当命令1执行不正确,命令2才会执行

* 管道符

管道符是一个非常有用的命令

命令格式: 命令1 | 命令2

命令1的正确输出作为命令2的操作对象

可以和grep这个命令一起使用,可以从输出内容中搜索自己想要寻找的具体的内容

8. 通配符和其他特殊字符

通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个字符
[] 匹配括号中任意一个字符,例如[abc]代表一定匹配一个字符
[-] 匹配中括号中任意一个字符,-代表一个范围,例如[a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]匹配不是一个数字的字符

Bash中的其他特殊字符

符号 作用
单引号 '' 会使特殊字符丧失作用
双引号 "" 有些特殊符号仍然会又作用
反引号` ` 反引号括起来的内容是系统命令,在bash中会优先执行
()使()
注释
$ 用于调用变量的值,比如需要调用变量name的值时,需要用$name的方式得到变量的值
\ 转义符

9. 正则表达式

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配

grep awk sed 等命令可以支持正则表达式

通配符用来匹配符合条件的文件名,通配符是完全匹配

ls find cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配

10. 其余常用的命令

cut字段提取命令

printf命令

grep命令

grep [选项] "搜索内容" 文件名 可以搜索文件中的某些具体内容

-i 忽略大小写

-n 输出行号

-v 反向查找

--color=auto 搜索出的关键字用颜色显示

例子: grep "echo" hello.sh 通过使用grep命令在hello.sh文件中寻找echo

cat hello.sh | grep -n --color=auto "Gray" 通过使用grep命令在输出中寻找 Gray

awk命令

awk使用教程

awk如何教程

sed命令

sed入门详细教程

排序命令 sort

语法: sort [选项] 文件名

选项:

-f 忽略大小写

-n 以数值型进行排序,默认使用字符型排序

-r 反向排序

-t 指定分隔符,默认分隔符是制表符

-k n[,m]: 按照指定的字段范围排序,从第n字段开始,m字段结束(默认到行尾)

统计命令 wc

语法: wc [选项] 文件名

选项:
-l 只统计行数
-w 只统计单词数
-m 只统计字符数

cat命令(concatenate)

如何在Linux系统中使用Cat命令 [22个典型示例]

使用cat查看文件内容详见上面链接,不在赘述

感觉cat比较重要的是和输入输出重定向结合使用

  • 使用cat创建名为test.txt的文件 cat > test.txt之后,然后使用快捷键ctrl+d结束文件内容
  • cat test1.txt test2.txt > test.txt 上面的命令将读取“ test1.txt ”和“ test2.txt ”文件的内容,并将它们写入新文件“ test.txt ”
  • cat >> test.txt 将文本附加到文件test.txt中
  • cat test1.txt >> test.txt 将文件内容追加到另一个文件的末尾
  • cat >test.txt << EOF 或者cat <<EOF > test.txt 会产生同样的结果,生成(或者覆盖)一个新的文件test.txt,在输入文本的时候以EOF为结尾,那样就不用使用ctrl+D

“ here document ”用符号"<<"和分隔符表示"EOF",它允许用户直接从终端输入多行文本并将它们保存到一个文件中。通过在新行中输入指定的定界符来终止输入过程。

Reference

  1. 100+最常用的Linux命令行大全

  2. 100+最常用的Linux命令行大全

posted @   光辉233  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示