1 Shell 基础介绍
1.1 Shell 简介
Shell 概述
- Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口
- Shell 将用户输入的命令并且把它们送到内核去执行,然后返回执行结果
- Shell 是可编程的,它允许用户编写由 Shell 命令组成的程序
Shell 发展史
- 1971 : Bell Labs 的 Ken Thompson 为 UNIX 开发了第一个 Shell: V6 Shell 是一个在内核之外执行的独立的用户程序
- 1977 :Steven Bourne 在 AT&T Bell Labs 为 V7 UNIX 创建 Bourne shell
- 1978 :Bill Joy 在伯克利分校攻读研究生期间为 BSD UNIX 系统开发的 csh
- 1983 : Ken Greer 在卡内基-梅隆大学开发了 tcsh,将 C Shell 引入了 Tenex 系统中的一些功能,如命令行编辑功能和文件名和命令自动补全功能
- 1983 :David Korn 在 AT&T Bell Labs 创建 korn shell,它功能更强大,提供关联数组表达式运算
- 1989 :Bourne-Again Shell(或 Bash)是一个开源 GNU 项目,旨在取代 Bourne shell;Bash 由 Brian Fox 开发,已成为世上最流行的 Shell,它兼容 sh、csh、ksh,是 Linux 系统的默认 Shell
在 Linux 中,有多种 Shell 程序可供选择,比如 dash、csh、zsh 等,默认的 Shell 可以在 /bin/sh
查看,在etc/passwd
中修改。
查看Shell
查看系统默认安装的 Shell
cat /etc/shells
查看当前登录用户默认 Shell
echo $SHELL
查看当前的 Shell
echo $0
1.2 Shell 脚本(定义、作用、格式、权限及执行)
Shell 脚本基础知识
在 Unix/Linux 里,一个程序/命令只做好一件事;复杂的问题可以通过多个命令的组合来解决;形式最简单的 Shell 脚本就是一系列命令构成的可执行文件,并可以被其他脚本复用。编写风格良好易读的 Shell 脚本可以提高日常任务的自动化程度和准确性。
Shell 脚本的约束Shell 脚本可以完成很多任务,但不适用于所有情况
- Shell 脚本可以完成很多任务,但不适用于所有情况
- 对于可以通过调用其他命令行实用工具来完成的任务,Shell 脚本是一种不错的选择
- Shell 脚本可以作为一种“胶水”语言,整合其他编程语言 当解决某个问题时,Shell 脚本实现起来复杂度高,效率低,此时就可以考虑使用其他编程语言。
Shell 脚本开发环境
可以在任意文本编辑器中打开新文件来创建 Shell 脚本。
高级编辑器如 Vim 和 Emacs,在识别文件的后缀为 .sh 后,可以提供语法高亮、检查、补全等功能。
[root@localhost~]# vim demo.sh #新建一个脚本文件,并写入如下内容:
#!/bin/bash
echo "Hello World“
[root@localhost~]# sh demo.sh
Hello World
Shell 脚本指定解释器
Shell 脚本只是静态的代码,若要输出结果,还需要解释器的参与。一般在脚本的第一行,指定执行此脚本的解释器。如果不指定解释器,脚本也能在默认的解释器中正常运行,但出于规范和安全的考虑,建议指定如下:
#!/bin/bash
#!/bin/csh
执行 Shell 脚本
对于脚本文件,我们有两种执行方式:
sh script_name.sh
./script_name.sh
Linux 中一切皆文件,脚本/命令/程序都是一个文件,文件作为一个对象,具有权限的属性。在执行别人发送或从网上下载的脚本时可能会遇到权限问题,赋予执行权限可解决:
chmod +x script_name.sh
如果某个 Shell 脚本可执行,则可以通过在命令行中输入其名称调用.被成功调用的前提是,脚本所在路径包含在 $PATH 变量中
- 查看 $PATH 变量
- 修改 $PATH 变量
- 查找某个命令/脚本的路径
[root@localhost~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost~]# PATH=$PATH:/New/path
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/New/path
#永久修改 $PATH 需要在 .bashrc 或 .bash_profile 中添加 export PATH=“$$PATH:/new/path”
后台执行 Shell 脚本
有时候一些脚本执行时间较长,命令行界面会被占用,因此可以采取后台运行脚本:
./my_script.sh &
这种方法在退出 Shell 后,脚本进程会随之终止,为了保证脚本一直运行,可以采用:
nohup ./my_script.sh &
脚本的的标准输出和标准错误会重定向到 nohup.out
文件里
使用 jobs 命令可以查看后台中运行着的进程。
2 Shell 编程基础
2.1 输入输出、管道
Linux 中的文本流
文本流存在于 Linux 的每一个进程中。Linux 的每个进程启动时,会打开三个文本流的端口:标准输入、标准输出、标准错误。这三个端口对应着一个程序的输入、输出和异常的抛出。
例如:
在 bash 中输入一串字符后,bash 进程中的标准输入端口捕获命令行中的输入,进行处理后从标准输出端口中传出,回显在屏幕上,如果处理过程中发生异常,则会通过标准错误端口,将异常回显在屏幕上。
输出重定向
某些情况下,我们需要保存程序的输出,此时就可以通过重定向,将程序的输出保存到文件中
- 将标准输出定向到文件中, 使用这种方式会将程序的标准输出覆盖文件内容:
ls > dir_log
- 将标准输出追加到文件中, 使用这种方式会将程序的标准输出追加至文件的末尾:
ls >> dir_log
- 执行完命令后,可以通过
cat dir_log
查看保存的文件内容
输入重定向
与输出重定向类似,输入重定向是把程序的标准输入进行重新定向。
输入重定向:
- 格式:
command < inputfile
- 将右边的文件作为标准输入,然后传入左边的命令
- 例:
wc -l < /dev/null
内联输入重定向:
- 格式:
command << maker
- 输出重定向需要文件,而内联输入重定向可以使用即时输入的文本作为标准输入,传入左边的命令
- 右边的字符“maker”作为标志,表示标准输入的开始和结束,自身不包含在标准输入里。
- 下图例中以“maker”作为标志
command << maker >file,同时将输入的内容存成文件
管道
有时需要将一个命令的输出连到另一个命令的输入,如果用重定向实现会