shell执行
#!/bin/bash #shebang指定解释器
执行方式
lang@liang:~/linux/shell$ chmod u+x test.sh
lang@liang:~/linux/shell$ ./test.shlang@liang:~/linux/shell$ /bin/bash ./test.sh
lang@liang:~/linux/shell$ . ./test.sh
lang@liang:~/linux/shell$ source ./test.sh
对比,前两种方式执行方式实质一样,后两种实质相同
shell执行过程解释:
lang@liang:~/linux/shell$ ls
1.当前shell fork产生子进程,子进程exec执行ls.
2.父进程(shell) wait等待子进程执行ls(exec)
3.子进程运行成功或者终止,父进程恢复运行.
对于后两种方式 . ./ls source ls
父进程直接在当前shell下执行命令,然后返回
其他问题:
将命令用(),引起来,那么shell 会直接fork出子shell来执行()中的命令.且可以多个命令;分割.
cd .. ; ls -l
特别强调
因为shell默认执行是fork--exec执行命令.
那么,我们在脚本中的cd .. 等改变状态的命令影响的只是子进程环境,并不改变父进程.
此时,如果有需求,那么.可以以 source执行 脚本
shell变量
命令
env
set
printenv
打印当前环境变量.
本地变量,只存在于当前shell,set命令显示当前shell定义的所有变量(本地变量以及环境变量)
shell中定义本地变量
VARNAME=value
export VARNAME 将本地变量导出为环境变量
unset VARNAME 删除本地变量或者环境变量
变量引用
shell变量都是字符串.对变量的引用使用$符号.
字符串拼接能力
lang@liang:~/linux/shell$ echo $SHELL
/bin/bash
lang@liang:~/linux/shell$ echo $SHELLaaa
lang@liang:~/linux/shell$ echo ${SHELL}aaa
/bin/bashaaa
变量名代换* ? []
通配符 * :匹配0或多个任意字符
?:匹配一个任意字符
[若干字符]:匹配[]中的任意一个字符的一次出现
命令带换: ` 或者 $()
lang@liang:~/linux/shell$ DATE=`date`
lang@liang:~/linux/shell$ echo $DATE
2016年 08月 15日 星期一 19:29:23 CST
lang@liang:~/linux/shell$ DATE=$(date)
lang@liang:~/linux/shell$ echo $DATE
2016年 08月 15日 星期一 19:30:20 CST
转义字符
lang@liang:~/linux/shell$ touch \$\ \$
lang@liang:~/linux/shell$ ll
-rw-rw-r-- 1 lang lang 0 8月 15 19:32 $ $
创建文件名 以 - 开头时可以如下处理
lang@liang:~/linux/shell$ touch ./-hell
lang@liang:~/linux/shell$ ll ./-hell
-rw-rw-r-- 1 lang lang 0 8月 15 19:32 ./-hell
lang@liang:~/linux/shell$ touch -- -lll
lang@liang:~/linux/shell$ ll
-rw-rw-r-- 1 lang lang 0 8月 15 19:35 -lll
单引号
shell脚本中单引号都可以界定字符串.而非字符,shell中单引号内的所有字符保持字面值.
双引号
双引号用于保持引号内suuoyou字符的字面值.(回车也不例外).除了以下
$变量值
``仍然表示命令替换
\$表示$的字面值
\代表转义.