一、Shell 历史
shell 的作用是解释执行用户的命令,用户输入一条命令,shell 解释器就执行一条,这种方式成为交互式,shell还有一种执行命令的方式成为批处理(Batch),用户事先写一个shell脚本(Shell Script),其中有很多条命令,让 shell 一次把这些指令执行完,而不必一条条的敲命令,shell脚本和编程语言很相似,也有变量和流程控制语句,但shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些指令,相当于一个用户把脚本中的命令一行一行的敲到shell提示符下执行。
由于历史原因,UNIX 系统上有很多中shell:
1、sh(Bourne Shell):由 Steve Bourne 开发,各种 UNIX 系统都配置的有 sh。
2、csh(C Shell):由 Bill Joy 开发,随 BSD UNIX 发布,它的流程控制语句很像 C 语言,支持很多 Bourne Shell 不支持的功能:作业控制,命令历史,命令行编辑;
3、ksh(Korn Shell): 由 David Korn 开发,向后兼容 sh ,并且添加了 csh 引入的新功能是目前很多 UNIX 系统标准配置的 Shell,在这些系统上 /bin/sh 往往是指向 /bin/ksh 的符号链接。
4、bash(Bourne Again Shell):由GUN开发的 Shell ,主要目标是与 POSIX 标准保持一致,同时兼顾对 sh 的兼容,bash 从 csh 和 ksh 借鉴了很多功能,是各种 Linux发行版标准配置的 Shell ,在 Linux 系统上 /bin/sh 往往是指向 /bin/bash 的符号链接,虽然如此,bash 和 sh 还是有很多不同的,一方面,bash 扩展了一些命令和参数,另一方面,bash 并不完全和 sh 兼容,有些行为并不一致,所以 bash 需要模拟 sh 的行为:当我们遇过 sh 这个程序名启动 bash 时,bash 可以假装自己是 sh ,不认扩展的命令,并且行为与 sh 保持一致。
二、初步认识 Shell
1、cat /etc/shells 查看当前操作系统下所支持的所有 shell
2、sh 进入 shell 命令解析器
3、shell 的第一句必须是
#!/bin/sh 这里的 sh 可以替换成 bash、dash 等等; 这句话的意思是指定用 sh 解析器
4、# # 在shell 中代表注释
5、执行 shell 脚本的四种方法
(1)、chmod a+x aa.sh 然后以 ./aa.sh 执行脚本
(2)、/bin/bash aa.sh 使用 /bin 指定解析器执行脚本
(3)、. aa.sh 使用 点和空格 执行脚本
(4)、source aa.sh 使用 source 执行脚本
三、内建命令和小括号
1、 man bash-builtins 查看系统的内建命令
2、常用内建命令(不需要解释器执行):
(1)、 . 点
(2)、source
(3)、alias 查看或修改别名
(4)、bg
(5)、cd
(6)、echo
3、;(分号) 可以一行执行多个命令
例如:
cd ...;ls -l 表示进入上一级目录,并且显示上一级目录的详细信息(此时当前路径已经改变,改为上一级目录)
(cd ..;ls -l) 用括号括起来,作用和上面相同,区别是此时不改变当前路径
4、shell 变量
(1)、定义:
shell 变量通常由字母、数字、下划线开头,由任意长度的字母、数字、下划线组成。
(2)、分类:
(a)、环境变量(类比于全局变量)
环境变量可以从父进程传递给子进程,因此 shell 进程的环境变量可以从当前 shell 传给 fork 出来的子进程。用 printenv 变量可以显示当前 shell 进程的环境变量。
(b)、本地变量(类比于局部变量)
不存在与当前 shell 进程,因此当前 shell 进程中所定义的所有变量(包括本地变量和环境变量)和函数。
(3)、用法:
VAR=hello 此时把VAR定义成本地变量
echo $VAR 将会输出 hello
export VAR 把VAR变量导入到环境变量中
用 unset 命令可以删除已经定义的环境变量或本地变量 如, unset VAR
注意:
(a)、 一个变量叫做 VAR,用 'VAR' 可以表示它的值,在不引起歧义的情况下用 VAR 表示它的值,通过以下例子比较这两种表示法的不同:
echo $SHELL.
(b)、在定义变量时不用 ' 取变量时要用。shell 变量不需要明确定义类型,事实上shell 变量的取值都是字符串。并且shell 变量不需要先定义后使用,如果对
一个没有定义的变量和取值,则字符串的值为空。
5、通配符
用于匹配的字符称为通配符。如: *,?,[]。
* 匹配 0 个或者多个任意字符
? 匹配一个任意字符
[若干个字符] 匹配方括号中任意一个字符的一次出现。
6、算术运算及转义字符
(1)、命令代换
由 “”`” 反引号括起来的也是一条命令,shell 先执行该命令,然后将输出的结果立刻代换到当前命令行中,例如:定义一个变量存放 date 命令的输出:
DATE=`date`
echo $DATE
可以代换为:
DATE=$(date)
(2)、使用 $(()),用于算数计算, (())那个中的 shell 变量取值将转换成整数,同样含义的 $[] 等价。例如:
VAR=45
echo $((VAR)+3) <============> echo $[VAR+3] <==============> $[$VAR+3]
$(()) 中只能用 +、-、*、/ 和 () 运算符,并且只能做整数运算。
$[base#n] 其中base 表示进制, n按照 base 进制解释,后面再有运算数,按十进制解释。
(3)、转义字符:
和 C 语言类似, \ 在shell 中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外)。换句话说,紧跟其后的字符取字面值。例如:
例如:
echo $SHELL
/bin/bash
echo \ SHELL
$SHELL
比如创建一个文件名为 “$ $” 的文件($ 间含有空格,可以这样):
touch \$\ \$
(4)、单引号:
和 C 语言同, shell 脚本中的单引号和双引号一样都是字符串的界定符,而不是字符串的界定符。单引号用于保持引号内所有字符的字面值,即使引号的 \ 和回车也不例外,但是字符串中不能出现单引号,如果引号没有配对就输入回车,shell 会给出续行的提示符,要求用户把引号配上对。例如:
echo `$SHELL`
$SHELL
echo `ABC\(回车)
>DE'(回车)
DE
(5)、双引号
被双引号扩住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。
DATE=$(date)
echo $DATE 输出 日期
echo "$DATE" 输出 日期
echo '$DATE' 输出 $DATE
VAR= 表示定义了一个环境变量VAR,它的值为null ,即字符串的长度为