Unix系统中常见的shell有:sh、csh、ksh、tcsh、bashshell
使用命令: vim /etc/shells 能够查看当前系统支持的bash编程
shell执行脚本是一门解释性语言、批量化处理语言,大大的节省了工做成本vim
shell脚本第一行必须以 #!开头,它表示该脚本使用后面的解释器解释执行。bash
举个栗子:编程语言
//script.sh 注:这是一个文本文件函数
#!/bin/bash echo "this is a test" ls ls -l echo "there are all files"
执行方式:学习
//第一种执行方式: [admin@localhost Shell]$ chmod +x script.sh [admin@localhost Shell]$ ./script.sh //第二种执行方式: [admin@localhost Shell]$ /bin/bash script.sh
执行过程:测试
Shell会fork一个子进程并调用exec执行./script.sh这个程序,exec系统调用应该把子进程的代码段替换成./script.sh程序的代码段,并从它的_start开始执行。然而script.sh是个文本文件,根 本没有代码段和_start函数,怎么办呢?其实exec还有另一种机制,若是要执行的是一个文本文件,而且第一行 指定了解释器,则用解释器程序的代码段替换当前进程,而且从解释器 的_start开始执行,而这个文本文件被看成命令行参数传给解释器。所以,执行上述脚本至关于执行程序!this
输入命令执行shell脚本后:spa
注意:像export、cd、env、set 这些内置命令,在键入命令行后,交互式进程不会建立子进程,而是调用bash内部的函数执行这些命令,改变的是交互式进程。
若是在命令行下,将多个命令用括号括起来,并用分号隔开来执行,交互式进程依然会建立一个子shell执行括号中的命令:
若是不加括号则是另外一种状况,cd .. 命令会直接在交互式shell下执行:
. 或者 source这两个命令是Shell的内建命令,这种方式不会建立子Shell,而是直接在交互式Shell下逐行 执行脚本中的命令。
例证:
script.sh
#!/bin/bash ls echo "#################" cd .. ls
shell变量不须要进行任何声明,直接定义便可,由于shell变量的值实际上都是字符串(对于没有定义的变量默认是一个空串)。定义的时候shell变量由大写字母加下划线组成,而且定义的时候等号两边不能存在空格,不然会被认为是命令!
shell变量的种类:
利用printenv能够显示当前shell进程的环境变量;利用set命令能够显示当前shell进程中的定义的全部变量(包括环境变量和本地变量)和函数。
一个shell变量定义后仅存在于当前Shell进程,是一个本地变量。用export命令能够把本地变量导出为环境变量。用unset命令能够删除已定义的环境变量或本地变量。
例如:
//分步 先定义后导出 COUNT=5 export COUNT //一步完成定义和导出环境变量 export COUNT=5 //删除已经定义的环境变量 unset COUNT
变量引用:
引用shell变量要用到$符号,加{}能够防止歧义。
例如:
COUNT=5 echo $COUNT echo ${COUNT}911
1.常见的通配符:
* : 匹配0个或多个任意字符
? : 匹配一个任意字符
[若干字符] : 匹配方括号中任意一个字符的一次出现
2.命令代换:
反引号`` 或者 $()
script.sh :
shell会先执行反引号或$()中的命令,将结果代换到当前命令行中!
反引号和$()的区别:
反引号自己就对\进行了转义,保留了自己意思,若是咱们想在反引号中起到\的特殊意义,咱们必须使用2个\来进行表示。
反引号中: \\ = \
$()中:\ = \
注意:反引号是老的用法,$()是新的用法,无论是在学习测试中,仍是在实际工做中,$()的用法都是被推荐的。
算数代换:$(())
例如:将2-1的结果赋给SUB,并显示本地变量SUB
SUB=$((2-1)) echo $SUB
3.单引号和双引号
Shell脚本中的单引号和双引号同样都是字符串的界定符,单引号用于保持引号内全部字符的字面值,而双引号有些状况则特殊。若是字符串中有特殊字符须要处理时就用双引号。
注:单引号标注的字符中不能再出现单引号。
举个栗子:
#!/bin/bash echo '\\' echo "\\" echo '`date`' echo "`date`"