shell 引用类型:
“”双引号
‘’单引号
·· 反引号
\ 反斜杠
单引号双引号区别: 除了类似作用,关键区别如下:
[nxuser@PSBJ-0-0-0 ~]$ BOY='boy' [nxuser@PSBJ-0-0-0 ~]$ echo $BOY boy [nxuser@PSBJ-0-0-0 ~]$ echo 'the $BOY did well' the $BOY did well [nxuser@PSBJ-0-0-0 ~]$ echo $BOY boy [nxuser@PSBJ-0-0-0 ~]$ echo "the $BOY did well" the boy did well [nxuser@PSBJ-0-0-0 ~]$
[nxuser@PSBJ-0-0-0 ~]$ echo date date [nxuser@PSBJ-0-0-0 ~]$ echo "date" date [nxuser@PSBJ-0-0-0 ~]$ echo 'date' date [nxuser@PSBJ-0-0-0 ~]$ echo `date` Thu Apr 17 10:51:01 CST 2014
如果下一个字符有特殊含义,反斜线防止 s h e l l 误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义: & * + ^ $ ` " | ?
./shell-script.sh其实就是fork的方式去运行一个程序(这个程序就是shell脚本)。所以这个新的shell脚本在运行时拥有父进程的一个环境变量表的拷贝。所以我们知道了,这种默认的shell脚本执行是会创建出新的进程的。
而另外还有两种用法,是不会创建出子进程的,那就是source和exec。
和fork方式不同,source和exec则都会在当前的进程内去执行相应的程序。所以就不存在环境变量的拷贝问题,该shell脚本的执行直接会影响 到当前的环境变量表。而且exec还有个特别之处就是,当它执行的程序完成之后,所在的进程也会退出。比如在Gnome的terminal中用exec command之后,当前的terminal就会退出,这个有时候还很有用。source还有一个很有趣的缩写,也就是一个点。比如. ./shell-script.sh,是不是很奇怪。
总结一下
New Process Terminate Current/Parent
-------------------------------------------------------
fork Y N
source N N
exec N Y
假设脚本为a.sh,则要运行该脚本,有以下方式
1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh, 如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可
2 sh/bash a.sh的路径,这种情况不需要脚本具有执行权限.
以上两种情况中,脚本中$0都是a.sh,都是在shell的子进程中运行的.
3 source a.sh的路径
4 . a.sh的路径
以上两种情况都是脚本在当前shell的进程中运行,所以$0都是bash/sh, 区别在于, source不是posix shell的内置命令,所以3在sh中实际上是不能运行的,在bash中可以. 而.则无论在bash还是posix shell中都是可以用来载入并执行脚本. 所以, 相对而言, 应该是4 更加具有移植性.
[nxuser@PSjamsBond-0-0-0 automatictests]$ ./test-FUNC-PRES-08.sh SIPP_LOG_DIRECTORY /tmp/test-FUNC-PRES-08 REPORT_LOG_DIRECTORY /tmp/test-FUNC-PRES-08 CURL_LOG_DIRECTORY /tmp/test-FUNC-PRES-08 RUN_TIME_DIRECTORY /tmp/test-FUNC-PRES-08 SNMP_COUNTERS_DIRECTORY /tmp/test-FUNC-PRES-08
[nxuser@PSjamsBond-0-0-0 automatictests]$ sh test-FUNC-PRES-08.sh SIPP_LOG_DIRECTORY /tmp/test-FUNC-PRES-08 REPORT_LOG_DIRECTORY /tmp/test-FUNC-PRES-08 CURL_LOG_DIRECTORY /tmp/test-FUNC-PRES-08 RUN_TIME_DIRECTORY /tmp/test-FUNC-PRES-08 SNMP_COUNTERS_DIRECTORY /tmp/test-FUNC-PRES-08