1、shell介绍
shell 俗称叫做壳,计算机的壳层,和内核是相对的,用于和用户交互,接收用户指令,调用相应的程序。
因此,把shell分为2大类
1.1、图形界面shell(Graphical User Interface shell 即 GUI shell)
也就是用户使用GUI和计算机核交互的shell,比如Windows下使用最广泛的Windows Explorer(Windows资源管理器),Linux下的X Window,以及各种更强大的CDE、GNOME、KDE、 XFCE。
他们都是GUI Shell。
1.2、命令行式shell(Command Line Interface shell ,即CLI shell)
也就是通过命令行和计算机交互的shell。 Windows NT 系统下有 cmd.exe(命令提示字符)和近年来微软大力推广的 Windows PowerShell。 Linux下有bash / sh / ksh / csh/zsh等 一般情况下,习惯把命令行shell(CLI shell)直接称做shell,以后,如果没有特别说明,shell就是指 CLI shell,后文也是主要讲Linux下的 CLI shell。
2、交互方式
根据交互方式的不一样,命令行式shell(CLI shell),又分为交互式shell和非交互式shell。
2.1、交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令,然后马上给你反馈。这种也是我们大多数时候使用的。
2.2、非交互式shell
非交互式shell,就是把shell放在写在一个文件里面,执行的时候,不与用户交互,从前往后依次执行,执行到文件结尾时,shell也就终止了。
3、shell的种类
在Linux下 ,各种shell百花齐放,种类繁多,不同的shell,也有不同的优缺点。 我们要查看当前系统下支持的shell,可以读取/etc/shells文件。
3.1、bash
Bourne Again Shell 用来替代Bourne shell,也是目前大多数Linux系统默认的shell。
3.2、sh
Bourne Shell 是一个比较老的shell,目前已经被/bin/bash所取代,在很多linux系统上,sh已经是一个指向bash的链接了。 下面是CentOS release 6.5 的系统
3.3、csh/tcsh
C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell,tcsh是增强版本的csh,目前csh已经很少使用了。
3.4、ksh
最早,bash交互体验很好,csh作为非交互式使用很爽,ksh就吸取了2者的优点。
3.5、zsh
zsh网上说的目前使用的人很少,但是感觉使用的人比较多。 zsh本身是不兼容bash的,但是他可以使用仿真模式(emulation mode)来模拟bash等,基本可以实现兼容。 在交互式的使用中,目前很多人都是zsh,因为zsh拥有很强大的提示和插件功能,炫酷吊炸天。推荐在终端的交互式使用中使用zsh,再安利一个插件Oh My Zsh 其实我个人的理解是,在终端中使用shell,基本上只是调用各种命令,比如:curl cat ls等等,基本不会使用到zsh的编程,所以终端中使用zsh是可以的。但是在写shell脚本的时候,需要考虑兼容性, 最主流的还是bash shell,所以,后文我们介绍的shell脚本也是bash shell的。
4、shell脚本
4.1、基础
#!/bin/bash
echo "Hello World !"
#!:是一个特殊的标记,表明使用啥解释器来执行,比如这里使用了:/bin/bash 来执行这个脚本。 #:只用一个#,就是注释 echo:输出 我们把上面的脚本保存成一个文件, 1.sh 后面的这个sh是shell脚本的扩展名。 然后要怎嚒来执行呢?执行一个shell脚本有很多种方式:
- sh 1.sh 这样可以直接执行这个1.sh
- 也可以直接 ./1.sh ,但是这种要注意,才编辑好的文件这样执行可能会报错
这个是因为没有这个脚本没有执行权限,运行 chmod a+x 1.sh 加上执行权限即可。 这里顺带说一下,为啥直接运行1.sh不行呢?因为他默认是去PATH里面找程序,当前目录,一般都不在PATH里面。所以直接运行1.sh就回报找不到文件。
- 还可以使用类似curl http://xxxxx.xxx/xxx.sh|sh 这样的方式,来执行远程的脚本
根据测试,#!/bin/bash 的标记,只是针对第二种方式 ./xxx.sh的方式有效。本文中代码,第一行均为这个标记,为了节约篇幅,已经省略.
执行并获取返回结果,有点类似JavaScript 的eval函数。
#!/bin/bash
dt=`date` #反引号内的字符串会当作shell执行 ,并且返回结果。
echo "dt=${dt}"
4.2、Shell 变量
shell的使用比较简单,就像这样,并且没有数据类型的概念,所有的变量都可以当成字符串来处理:
#!/bin/bash
myName="tom"
youName="cat"
不需要申明,直接写就可以了,但是有几个点需要特别注意:
- 等号两边不能有空格!!!特别要注意,非常容易写错
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字。
使用变量
ABC="tom"
echo $ABC #使用变量前面加$美元符号
echo "ABC=$ABC" #可以直接在字符串里面引用
echo "ABC=${ABC}" #但是建议把变量名字用{}包起来
只读变量
ABC="tom"
echo "ABC=${ABC}"
readOnly ABC #设置只读
ABC