Shell简介:
什么是shell
Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
-
Bourne Shell(/usr/bin/sh或/bin/sh)
-
Bourne Again Shell(/bin/bash)
-
C Shell(/usr/bin/csh)
-
K Shell(/usr/bin/ksh)
-
Shell for Root(/sbin/sh)
-
……
由于易用和免费,Bash(Bourne Again Shell) 在日常工作中被广泛使用,是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
shell执行命令解释的过程
Shell定义了一些内置命令,一般把shell自身解释执行的命令称为内置命令,例如:cd、pwd、echo和exit等。用户登入系统后,shell及内置命令就被载入到内存,直到用户退出为止。除内置命令外,Linux系统上还有很多可执行文件,例如:ls就存放在/bin/ls中,只有被调用时才会被装入内存中执行。
通过type指令可以直到指令是否是bash的内建指令。
shell命令的语法分析
指令较长时利用\[Enter]可进入下一行继续输入,\后紧接Enter,中间不能有空格。
Shell 命令的基本格式:command [选项] [参数]
选项的作用是调整命令功能。如果没有选项,那么命令只能执行最基本的功能;而一旦有选项,则能执行更多功能,或者显示更加丰富的数据。
短格式选项和长格式选项
Linux 的选项又分为短格式选项和长格式选项。
- 短格式选项是长格式选项的简写,用一个减号
-
和一个字母表示,例如ls -l
。 - 长格式选项是完整的英文单词,用两个减号
--
和一个单词表示,例如ls --all
。
一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项。当然也有例外,比如 ls 命令的短格式选项-l
就没有对应的长格式选项,所以具体的命令选项还需要通过帮助手册来查询。
shell的通配符与特殊符号
为了方便用户对目录或文件的表述。bash中常用的通配符有:“*”、“?”、“[]”。
- *:匹配任意一个或多个字符
- ?:匹配任意单一字符
- []:匹配任何包含在括号内的单字符
bash环境中的特殊符号
shell的重定向
shell将键盘设为默认的标准输入,将屏幕设为标准输出和标准错误输出。所谓重定向,就是不使用标准的输入输出,而是重新指定。
1、输入重定向:改变命令输入源,可将文件的内容作为命令的输入,输入重定向操作符有:“<”和“<<”。
2、输出重定向:将输出结果输入到指定文件中,操作符有“>”和“>>”。
3、错误重定向:将输出错误结果输入到指定文件中,操作符有2“>”和“2>>”。
输出重定向:>
代表的是覆盖,>>
代表的是追加。
类 型 | 符 号 | 作 用 |
---|---|---|
标准输出重定向 | command >file | 以覆盖的方式,把 command 的正确输出结果输出到 file 文件中。 |
command >>file | 以追加的方式,把 command 的正确输出结果输出到 file 文件中。 | |
标准错误输出重定向 | command 2>file | 以覆盖的方式,把 command 的错误信息输出到 file 文件中。 |
command 2>>file | 以追加的方式,把 command 的错误信息输出到 file 文件中。 | |
正确输出和错误信息同时保存 | command >file 2>&1 | 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 |
command >>file 2>&1 | 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 | |
command >file1 2>file2 | 以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | |
command >>file1 2>>file2 | 以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | |
command >file 2>file | 【不推荐】这两种写法会导致 file 被打开两次,引起资源竞争,所以 stdout 和 stderr 会互相覆盖。 | |
command >>file 2>>file |
需要重点说明的是,fd
和>
之间不能有空格,否则 Shell 会解析失败;>
和file
之间的空格可有可无。为了保持一致,我习惯在>
两边都不加空格。
输入重定向:
符号 | 说明 |
---|---|
command <file | 将 file 文件中的内容作为 command 的输入。 |
command <<END | 从标准输入(键盘)中读取数据,直到遇见分界符 END 才停止(分界符可以是任意的字符串,用户自己定义)。 |
command <file1 >file2 | 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2。 |
#将正确与错误的数据分别存入不同的文件中:
find /home -name .bashrc > list_right 2> list_error
#将错误信息忽略掉而不显示或储存
find /home -name .bashrc 2> /dev/null
# 将正确和错误数据写入同一文件(list)中
find /home -name .bashrc > list 2>&1
find /home -name .bashrc &> list
shell管道
管道可以把很多命令连接起来,可以把前一个命令的输出当作 后一个命令的输入。管道的作用就是把一个命令的输出当作下一个命令的输入,而不经过任何中间文件。管道符为 “|” 。
shell中的引用
引用就是通知shell将特殊字符当作普通字符处理。shell中用于引用的字符有转义字符“\”、单引号“'”、双引号“""”。
1、转义字符“\”:将特殊字符转为普通字符
2、单引号“'”:将字符串放在一对单引号之间,字符中所有字符的特殊含义将被忽略
3、双引号“""”:与单引号作用基本相同,但部分特殊字符在双引号之间依然保留特殊含义,如:$、\、`
运行 Shell 脚本
运行 Shell 脚本有两种方法,一种在新进程中运行,一种是在当前 Shell 进程中运行。
在新进程中运行 Shell 脚本
1、作为可执行程序:进入相应目录,执行./test.sh (test.sh为执行脚本)
Shell 脚本也是一种解释执行的程序,可以在终端直接调用(需要使用 chmod 命令给 Shell 脚本加上执行权限)
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2、作为解释器参数:
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:/bin/sh test.sh
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
这两种写法在本质上是一样的:第一种写法给出了绝对路径,会直接运行 Bash 解释器;第二种写法通过 bash 命令找到 Bash 解释器所在的目录,然后再运行,只不过多了一个查找的过程而已。
在当前进程中运行 Shell 脚本
source 是Shell内置命令,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。
source 命令的用法为:source filename
也可以简写为:. filename
两种写法的效果相同。对于第二种写法,注意点号.
和文件名中间有一个空格。