目录

引言
在现代计算机操作系统中,Shell 作为用户与系统内核之间的重要桥梁,扮演着不可或缺的角色。它不仅提供了一个命令行界面,方便用户输入和执行命令,还允许用户通过编写脚本实现复杂的自动化任务。通过掌握Shell的基本功能和用法,用户可以高效地管理系统、处理数据,并提升工作效率。
一、Shell概述——什么是shell?
Shell是操作系统中用户与内核(kernel)进行交互的一种接口,它接收用户输入的命令并把它送入操作系统去执行,然后将执行结果返回给用户。
Shell也被称为命令行界面或终端。
Shell 不仅仅是一个命令行解释器,它也是一种强大的编程语言,允许用户编写脚本来自动化执行一系列命令。
二、Shell概述——shell功能
命令解释:Shell 接收用户输入的命令,并解释这些命令,然后将其传递给操作系统内核去执行。Shell是操作系统中用户与内核(kernel)进行交互的一种接口,它接收用户输入的命令并把它送入操作系统去执行,然后将执行结果返回给用户。
程序执行:Shell 可以直接执行程序,也可以作为程序的解释器来执行脚本。脚本是一系列命令的集合,Shell 可以按照脚本中的顺序执行这些命令。
输入输出重定向:Shell 允许用户将命令的输入重定向到文件,或将命令的输出保存到文件中,从而实现数据的自动化处理。
管道(Pipeline):Shell 支持管道功能,可以将一个命令的输出作为另一个命令的输入,从而实现命令的串联执行。
三、Shell概述——命令解释
例如,ls命令会被Shell解析并解释为列出当前目录下的文件和文件夹的命令,然后 Shell 会调用相应的系统调用来执行这个操作。
四、Shell概述——程序执行
1、创建shell文件
有两种方法:
①用touch命令来创建
②vi/vim命令来创建文件,vi/vim用于打开文本编辑器,如果你打开的.sh文件不存在的话,会根据你输入的文件名创建一个。
使用touch命令来创建sh文件,ls命令可以查看文件是否创建成功。
2、打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。(我这里没有安装vim,可以根据提示进行安装,我换成用vi来打开sh文件。)
进入编辑模式了,我们复制下面的两行代码写入进去。然后输入 :wq 退出并保存。
输入一些代码,第一行一般是这样:
#!/bin/bash
echo “hello ahead”
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
2、运行 Shell 脚本有两种方法:
①作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
②作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
这种方式运行的脚本,不需要在第一行指定解释器信息。
五、Shell概述——输入输出重定向
Shell允许用户将命令的输入重定向到文件,或将命令的输出保存到文件中。这通过 >(输出重定向)和 <(输入重定向)等符号实现。例如,ls > files.txt 命令会将ls命令的输出(即当前目录下的文件和文件夹列表)保存到files.txt文件中,而不是显示在屏幕上。
1、输出重定向(>)
输出重定向:将一个程序的标准输出写到一个文件中
输出重定向会覆盖文件内容,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾.
即输入: ls >> study.txt
就会在文件末尾追加内容。
2、输入重定向(<)
输入重定向:把文件里面的内容输入到变量line里再打印出来。
while IFS= read -r line; do echo "$line"; done < study.txt
这个脚本使用while循环和输入重定向来逐行读取study.txt文件的内容。对于文件中的每一行,它都会将该行赋值给变量line,并打印出来。这里使用了IFS=(内部字段分隔符设置为空)
和 -r(避免反斜杠转义)选项来确保read命令按预期工作。
六、重定向深入讲解
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以这样写:
$ command 2>file
如果希望 stderr 追加到 file 文件末尾,可以这样写:
$ command 2>>file
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
或者
$ command >> file 2>&1
如果希望对 stdin 和 stdout 都重定向,可以这样写:
$ command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。
七、Shell概述——管道
管道是直接将一个程序的标准输出与另一个程序的标准输入相连接,不需要经过任何中间文件,通过 | 符号实现。
例如,cat study.txt | grep "a" 命令会先使用cat命令读取 study.txt文件的内容,然后通过管道将这些内容传递给grep命令,grep命令再从中搜索包含"a"的行。
cat study.txt | grep "a"
总结
通过对Shell的深入了解,我们可以发现它不仅是一个简单的命令行工具,更是一个强大的编程环境。无论是命令的解释执行、输入输出重定向,还是管道的使用,Shell都为用户提供了灵活的操作方式。掌握这些知识后,用户能够更加自信地使用Shell进行日常的系统管理和脚本编写,极大地提高工作效率和自动化水平。