如何修改网站后台登陆入口路劲,中国航发网上商城废旧物资,电脑怎样做幻灯片的网站,企业微信小程序免费制作平台文章目录Shell 介绍Shell 种类命令行环境终端模拟器命令行提示符进入和退出方法Shell 脚本第一个shell脚本BashBash如何解析命令Shell 和 Bash 的历史Shell 介绍
简单点理解#xff0c;就是系统跟计算机硬件交互时使用的中间介质#xff0c;它只是系统的一个工具。实际上就是系统跟计算机硬件交互时使用的中间介质它只是系统的一个工具。实际上在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方如果把计算机硬件比作一个人的躯体而系统内核则是人的大脑至于shell把它比作人的五官似乎更加贴切些。回到计算机上来用户直接面对的不是计算机硬件而是shell用户把指令告诉shell然后shell再传输给系统内核接着内核再去支配计算机硬件去执行各种操作。
Shell 是一个用 C 语言编写的程序它是用户使用 Linux 的桥梁。Shell 既是一种命令语言又是一种程序设计语言。
Shell 是指一种应用程序这个应用程序提供了一个界面用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix ShellWindows Explorer 是一个典型的图形界面 Shell。
Shell 编程跟 JavaScript、php 编程一样只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Shell 这个单词的原意是“外壳”跟 kernel内核相对应比喻内核外面的一层即用户跟内核交互的对话界面。
具体来说Shell 这个词有多种含义。
首先Shell 是一个程序提供一个与用户对话的环境。这个环境只有一个命令提示符让用户从键盘输入命令所以又称为命令行环境command line interface简写为 CLI。Shell 接收到用户输入的命令将命令送入操作系统执行并将结果返回给用户。本书中除非特别指明Shell 指的就是命令行环境。
其次Shell 是一个命令解释器解释用户输入的命令。它支持变量、条件判断、循环操作等语法所以用户可以用 Shell 命令写出各种小程序又称为脚本script。这些脚本都通过 Shell 的解释执行而不通过编译。
最后Shell 是一个工具箱提供了各种小工具供用户方便地使用操作系统的功能。
Shell 种类
Linux Shell 有很多种只要能给用户提供命令行环境的程序都可以看作是 Shell。
历史上主要的 Shell 有下面这些。
Bourne Shellsh 命令文件 /usr/bin/sh或/bin/sh Bourne Again shellbash命令文件 /bin/bash C Shellcsh命令文件 /usr/bin/csh TENEX C Shelltcsh Korn shellksh命令文件 /usr/bin/ksh Z Shellzsh命令文件 /usr/bin/zsh Friendly Interactive Shellfish Shell for Root/sbin/sh …
Bash 是目前最常用的 Shell除非特别指明下文的 Shell 和 Bash 当作同义词使用可以互换。
在一般情况下人们并不区分 Bourne Shell 和 Bourne Again Shell所以像 #!/bin/sh它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
下面的命令可以查看当前运行的 Shell
$ echo $SHELL
/bin/bash下面的命令可以查看当前的 Linux 系统安装的所有 Shell。
$ cat /etc/shells上面两个命令中$ 是命令行环境的提示符用户只需要输入提示符后面的内容。
Linux 允许每个用户使用不同的 Shell用户的默认 Shell 一般都是 Bash或者与 Bash 兼容。
命令行环境
终端模拟器
如果是不带有图形环境的 Linux 系统比如专用于服务器的系统启动后就直接是命令行环境。
不过现在大部分的 Linux 发行版尤其是针对普通用户的发行版都是图形环境。用户登录系统后自动进入图形环境需要自己启动终端模拟器才能进入命令行环境。
所谓“终端模拟器”terminal emulator就是一个模拟命令行窗口的程序让用户在一个窗口中使用命令行环境并且提供各种附加功能比如调整颜色、字体大小、行距等等。
不同 Linux 发行版准确地说是不同的桌面环境带有的终端程序是不一样的比如 KDE 桌面环境的终端程序是 konsoleGnome 桌面环境的终端程序是 gnome-terminal用户也可以安装第三方的终端程序。所有终端程序尽管名字不同基本功能都是一样的就是让用户可以进入命令行环境使用 Shell。
命令行提示符
进入命令行环境以后用户会看到 Shell 的提示符。提示符往往是一串前缀最后以一个美元符号$结尾用户可以在这个符号后面输入各种命令。
[userhostname] $上面例子中完整的提示符是[userhostname] $其中前缀是用户名user加上再加主机名hostname。比如用户名是bill主机名是home-machine前缀就是billhome-machine。
注意根用户root的提示符不以美元符号$结尾而以井号#结尾用来提醒用户现在具有根权限可以执行各种操作务必小心不要出现误操作。这个符号是可以自己定义的详见《命令提示符》一章。
为了简洁后文的命令行提示符都只使用$表示。
进入和退出方法
进入命令行环境以后一般就已经打开 Bash 了。如果你的 Shell 不是 Bash可以输入bash命令启动 Bash。
$ bash退出 Bash 环境可以使用exit命令也可以同时按下Ctrl d。
$ exitBash 的基本用法就是在命令行输入各种命令非常直观。作为练习可以试着输入pwd命令。按下回车键就会显示当前所在的目录。
$ pwd
/home/me如果不小心输入了pwe会返回一个提示表示输入出错没有对应的可执行程序。
$ pwe
bash: pwe未找到命令Shell 脚本
Shell 脚本shell script是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本但读者朋友要知道shell 和 shell script 是两个不同的概念。
第一个shell脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件)新建一个文件 test.sh扩展名为 shsh代表shell扩展名并不影响脚本执行见名知意就好如果你用 php 写 shell 脚本扩展名就用 php 好了。
输入一些代码第一行一般是这样
#!/bin/bash
echo Hello World !#! 是一个约定的标记它告诉系统这个脚本需要什么解释器来执行即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
运行 Shell 脚本有两种方法 1、作为可执行程序
将上面的代码保存为 test.sh并 cd 到相应目录
chmod x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本注意一定要写成 ./test.sh而不是 test.sh运行其它二进制的程序也一样直接写 test.shlinux 系统会去 PATH 里寻找有没有叫 test.sh 的而只有 /bin, /sbin, /usr/bin/usr/sbin 等在 PATH 里你的当前目录通常不在 PATH 里所以写成 test.sh 是会找不到命令的要用 ./test.sh 告诉系统说就在当前目录找。
2、作为解释器参数
这种运行方式是直接运行解释器其参数就是 shell 脚本的文件名如
/bin/sh test.sh
/bin/php test.php这种方式运行的脚本不需要在第一行指定解释器信息写了也没用。
Bash
Bash 是一个为GNU项目编写的Unix shell。它的名字是一系列缩写Bourne-Again SHell — 这是关于Bourne shellsh的一个双关语Bourne again / born again。Bourne shell是一个早期的重要shell由Stephen Bourne在1978年前后编写并同Version 7 Unix一起发布。bash则在1987年由Brian Fox创造。在1990年Chet Ramey成为了主要的维护者。
bash是大多数Linux系统以及Mac OS X v10.4默认的shell它能运行于大多数Unix风格的操作系统之上甚至被移植到了Microsoft Windows上的Cygwin系统中以实现windows的POSIX虚拟接口。此外它也被DJGPP项目移植到了MS-DOS上。
bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。 bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh) 例如命令行编辑命令历史目录栈$RANDOM 和 $PPID 变量以及POSIX的命令置换语法 $(…)。作为一个交互式的shell按下TAB键即可自动补全已部分输入的程序名文件名变量名等等。
Bash 是 Unix 系统和 Linux 系统的一种 Shell命令行环境是目前绝大多数 Linux 发行版的默认 Shell。
Unix中有两种主要的shell类别
Bourne shell − If you are using a Bourne-type shell, the $ character is the default prompt.C shell − If you are using a C-type shell, the % character is the default prompt.
linux的发布版本之一——Redhat/CentOS——系统默认安装的shell叫做bash即Bourne Again Shell它是shBourne Shell的增强版本。Bourn Shell 是最早行起来的一个shell创始人叫Steven Bourne为了纪念他所以叫做Bourn Shell检称sh。那么这个bash有什么特点呢
记录命令历史 我们敲过的命令linux是会有记录的预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。指令和文件名补全 按tab键它可以帮你补全一个指令也可以帮你补全一个路径或者一个文件名。连续按两次tab键系统则会把所有的指令或者文件名都列出来。别名 前面也出现过alias的介绍这个就是bash所特有的功能之一了。我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。通配符 在bash下可以使用*来匹配零个或多个字符而用?匹配一个字符。输入输出重定向 输入重定向用于改变命令的输入输出重定向用于改变命令的输出。输出重定向更为常用它经常用于将命令的结果输入到文件中而不是屏幕上。输入重定向的命令是输出重定向的命令是另外还有错误重定向2以及追加重定向。管道符 前面已经提过过管道符”|”就是把前面的命令运行的结果丢给后面的命令。作业控制 当运行一个进程时你可以使它暂停按Ctrlz然后使用fg命令恢复它利用bg命令使他到后台运行你也可以使它终止按Ctrlc。
Bash如何解析命令 按行读取命令 处理引用问题 双引号内的字符将失去其原有意义除了$, 和\。 单引号内的字符将失去其原有意义包括$, 和\。 将输入的一行字符串按照 ; 分割成多个命令。 处理特殊字符 {..}, (..), ..., .., .. | ..等特殊字符会被按照特殊的执行次序处理。 重定向符号会被从命令行中移除所以在执行命令时... log, 21这些命令都是不会提交给内核处理命令的进程的。 其他符号会被其对应的结果表达所替代如{..}命令
$ echo {a..c}
a b c变量替换 将带 $ 符号的变量 $parameter替换成变量内容 术语叫Parameter Expansion.
$ echo $PWD
/z/ros将命令行分割成被执行命令和参数 分割的原则是任何空白空格、Tab都将作为分隔符将一整条命令分割成一个一个的词。分割后结果的第一个词作为命令其他词作为参数。如果命令词中包含空白需要用引号括起来。
$ My Command /foo/bar ## This will execute the command named My because it is the first word.
$ My Command /foo/bar ## This will execute the command named My Command because the space inside the quotes has lost its special meaning allowing it to split words.Tips: 在从Windows或MacOS将文件复制到Linux时有些文件的文件名可能包含Linux不支持的特殊字符如空格#等如文件名file 1127.txt在Windows下是合法的但是在Linux不合法删除这个文件的命令
$ rm file 1127.txt // not work
$ rm file 1127.txt // work执行命令 a. 如果命令是 function or builtin该命令将会被接收命令的同一个Bash process处理。 b. 否则 (像是 hadoop fs 等命令), Bash 将会 fork off创造一个新的Bash子进程将解析好的命令传递给它并等待它返回结果。一般情况下子进程将会继承父进程的标准流。
Shell 和 Bash 的历史
Shell 伴随着 Unix 系统的诞生而诞生。
1969年Ken Thompson 和 Dennis Ritchie 开发了第一版的 Unix。
1971年Ken Thompson 编写了最初的 Shell称为 Thompson shell程序名是sh方便用户使用 Unix。
1973年至1975年间John R. Mashey 扩展了最初的 Thompson shell添加了编程功能使得 Shell 成为一种编程语言。这个版本的 Shell 称为 Mashey shell。
1976年Stephen Bourne 结合 Mashey shell 的功能重写一个新的 Shell称为 Bourne shell。
1978年加州大学伯克利分校的 Bill Joy 开发了 C shell为 Shell 提供 C 语言的语法程序名是csh。它是第一个真正替代sh的 UNIX shell被合并到 Berkeley UNIX 的 2BSD 版本中。
1979年UNIX 第七版发布内置了 Bourne Shell导致它成为 Unix 的默认 Shell。注意Thompson shell、Mashey shell 和 Bourne shell 都是贝尔实验室的产品程序名都是sh。对于用户来说它们是同一个东西只是底层代码不同而已。
1983年David Korn 开发了Korn shell程序名是ksh。
1985年Richard Stallman 成立了自由软件基金会FSF由于 Shell 的版权属于贝尔公司所以他决定写一个自由版权的、使用 GNU 许可证的 Shell 程序避免 Unix 的版权争议。
1988年自由软件基金会的第一个付薪程序员 Brian Fox 写了一个 Shell功能基本上是 Bourne shell 的克隆叫做 Bourne-Again SHell简称 Bash程序名为bash任何人都可以免费使用。后来它逐渐成为 Linux 系统的标准 Shell。
1989年Bash 发布1.0版。
1996年Bash 发布2.0版。
2004年Bash 发布3.0版。
2009年Bash 发布4.0版。
2019年Bash 发布5.0版。
用户可以通过bash命令的--version参数或者环境变量$BASH_VERSION查看本机的 Bash 版本。
$ bash --version
GNU bash版本 5.0.3(1)-release (x86_64-pc-linux-gnu)# 或者
$ echo $BASH_VERSION
5.0.3(1)-release参考来源 学习 Shell 脚本之前的基础知识