概念
真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做Shell。
Shell 除了能解释用户输入的命令,将它传递给内核,还可以:
- 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
- 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
- Shell 本身也可以被其他程序调用。
Shell 是将内核、程序和用户连接了起来。
Shell 虽然没有 C/C++、Java、Python 等强大,但也支持了基本的编程元素,例如:
- if...else 选择结构,switch...case 开关语句,for、while、until 循环;
- 变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
- 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)
站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。
Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件
常见的Shell有sh bash csh tcsh ash等
sh: Bourne shell 由 AT&T 公司的 Steve Bourne开发,sh 是 UNIX 上的标准 shell
bash:bash shell 是 Linux 的默认shell,bash 由 GNU 组织开发,保持了对 sh shell 的兼容性
使用
启动终端模拟包或者从 Linux控制台登录后,便可以看到Shell提示符。提示符是通往 Shell 的大门,是输入 Shell 命令的地方。
Shell 通过PS1和PS2两个环境变量来控制提示符格式:PS1 控制最外层命令行的提示符格式;PS2 控制第二层命令行的提示符格式。
Shell Script 用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,这个文件后缀为.sh
打开文本编辑器,新建一个文本文件,并命名为test.sh
在test.sh中输入代码:
#!/usr/bin/env bash
echo "Hello World !" #这是一条注释
第1行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell;后面的 /bin/bash就是指明了解释器的具体位置。
第2行即为代码内容。第2行的#及其后面的内容是注释,Shell脚本中所有以#开头的都是注释(当然以#!开头的除外)
如何执行test.sh这个程序呢?有三种方法,首先切换到test.sh所在的目录:使用点号 例如 . ./test.sh;使用source命令 ,例如source test.sh;作为解释器参数,例如 /bin/bash test.sh。可以使用 chmod +x test.sh 让这个脚本文件变为可执行的。
语法
用赋值符号 = 时,前后都不能加空格。
字符串的拼接不需要任何连接符,写在一起就可以。
整数运算需要写在 (( 运算表达式 )) 中,可以用 $(( 运算表达式 )) 取值。
关键字 [[ 表达式 ]] 这个表达式的成立时,退出状态为0,否则为非0值。
将命令的执行结果赋值给变量:
- variable=`command`
- variable=$(command)
shell中函数在定义时不能指明参数,但在调用时却可以传递参数。函数参数是shell位置参数的一种,在函数内部可以使用$n来接收,例如,$1表示第一个参数,$2表示第二个参数,依次类推。$#可以获取传递的参数个数;$@和$*可以一次性获取所有的参数。
当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
但是当它们被双引号" "包含时,就会有区别了:
- "$*"会将所有的参数从整体上看做一份数据。
- "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
使用for循环逐个输出数据,可以看出区别。
非原创,侵删,内容来源 http://c.biancheng.net/shell/
End