bash备忘
hanlray@gmail.comRevision: 1.01 Date: 2006/09/02
1. String比较操作符
- str1 = str2
- str1 != str2
- str1 > str2
- str2 < str2
- -n str1 str1 is not null
- -z str1 str1 is null
2. && 和 ||
- statement1 && statement2 执行statement1,如果它的退出状态是0,执行statement2
- statement1 || statement2 执行statement1,如果它的退出状态不是0,执行statement2
3. job control
当我们知道某个命令需要执行很久时,可以在该命令后加一个&号把它放到background执行;但当执行了一个命令后才发现它需要执行很久时,我们可以用Ctrl+Z来suspend当前在foreground执行的命令,然后用bg把它放到background执行;把某个在把background里执行的命令放回foreground,用fg [jobid],不带参数就选择最近被放到background的job;用jobs列出在background里的job
4. .bash_profile/.bash_login/.profile、.bashrc、.bash_logout
.bash_profile是只被login shell执行,当其不存在时会找.bash_login,当.bash_login不存在时找.profile .bashrc是当你在命令行上键入bash来新开一个shell时执行的文件 .bash_logout是每次login shell退出时执行的文件 当然.bash_profile里应该执行.bashrc
5. 变量和环境变量
给一个变量赋值:varname=value 使之成为环境变量:export varname 或者写在一起:export varname=value,用unset来取消赋值,就像该变量
怎么判断某个变量是否是环境变量呢?export命令会列出所有的环境变量
5.1. 重要的环境变量
- PATH 如果没有指命令路径的话,bash将会到这里来寻找命令
5.2. 特殊变量
- $? 上一个命令的退出状态
- 表达式 +
- $(unix command) 其值为命令输出到标准输出的内容
- ${varname:-expr} 若varname存在则返回其值,否则返回expr的值
6. #!
在bash中除了可以运行function、build-in command外,还可以运行属性为x的可执行文件,这时bash会创建一个子进程并通过检查文件开头是否有#!来判断是一个binary executable还是一个script,对binary executable直接运行(exec)该程序,对script则会运行#!指定的script解释器,然后由该解释器负责执行script中的各个语句。
7. exec
如上所述,当运行一个bash script时,当前shell会创建一个subshell,如果该script充当的是另一个程序的启动器,那么在script的最后就需要调用这个可执行程序,这时如果像在login bash中一样直接通过文件名来启动,那么当前subshell将会另建一个子进程来运行它,并且当该子进程退出后subshell才会退出,这样在这个程序的运行期间,这个subshell就是多余的,白白空占资源。这时可以用bash的exec命令来执行这个程序,它用指定的程序替换当前的shell,因此没有多余的进程产生。