1、变量
定义一个变量:varname=value,等号两边不能有空格,否则会被解释成命令。
变量分为本地变量和环境变量。本地变量只存在于当前的shell进程,而环境变量
可以从当前进程传递给fork出来的子进程。printenv可以打印出当前进程的环境变量。
用export可以将本地变量导出成环境变量。用unset可以删除变量。
2、命令代换
可以用`和$()进行命令代换。如:
birth=`date`或birth=$(date)
3、算术代换$(())
var=45
echo $(($var+3))
4、转义字符/
这个/没什么好说的,各种语言都有,不过在shell里有个特殊的地方。
其中“-”加上转义字符也不行,如果要创建一个-hell的文件,你需要这么做
touch ./-hello
5、交互登录的shell
就是输入用户名和密码后得到的shell。
进入登录shell后会执行一系列文件:
/etc/profile、~/.bash_profile、~/.bash_login、~/.profile
在退出时候要执行~/.bash_logout
6、交互非登录的shell
在图形界面打开一个终端或者在登陆shell中执行bash命令,就得到一个交互非登录的shell。
这种shell在启动时自动执行~/.bashrc。
一般在bashrc里面设置本地变量、函数、alias。
7、非交互启动的shell
为执行脚本而fork出来的是非交互shell。
它会执行 BASH_ENV这个环境变量指定的文件。
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
8、条件测试
可以用test或[进行条件测试,如果测试结果为真就返回0,如果为假就返回1。
测试两个数的大小:
[是一个命令,传递给它的参数都用空格分开。
常见的测试命令如下:
[ -d dir ] :如果dir存在,返回真
[ -f filename ] :如果filename这个文件存在,就返回真
[ -z string ] :如果string为空返回真
[ -n string ] :如果string不为空返回真
[ string1 = string2 ] :如果相等返回真
[ string1 != string2 ] :如果不相等返回真
[ arg1 OP arg2 ] :OP可以是-gt/-lt/-ge/-le/-eq/-ne中的任意一个。
其他语言常用的!、and、or在shell里面这么表示:
[ ! exp ]
[ exp1 -a exp2 ]
[ exp1 -o exp2 ]
举个例子:
[ -d test -a “$var”="abc" ]
其中$var一般要用引号引起来,否则容易引起错误。原因是,如果var为空的话,这句会被
解释成这样:[ -d test -a ="abc" ],这显然有语法错误,但是加上引号就会被解释成这样:
[ -d test -a ""="abc" ]这样无论如何都不会有语法错误了。
9、if语句
if语句常常包含以下关键词: if、then、 else、elif、fi。
if [ -f ~/.bashrc ]是一条,then . ~/.bashrc、fi各是一条。如果两条写在一块,就要用“;”分割。
:是一个空命令,表示什么也不执行。
10、case语句
11、for/do/done
12、while/do/done
13、位置参数和特殊变量
$0:文件名
$#:参数个数
$@:参数列表,不包括$0
$?:上一次命令执行是否成功的标志
$$:进程id
14、函数
调用函数时可以传递任意个参数,在函数内提取参数用$0/$1....
下面这个脚本可以一次创建多个目录,各目录名通过命令行参数传入,脚本逐个测试各目录是否存在,如果目录不存在,首先打印信息然后试着创建该目录。
15、脚本的调试
sh -x ./test.sh:这样可以将执行的每一条命令和结果打印出来。