当前位置: > shell编程 >

Shell 第二天

时间:2015-10-10 12:43来源:linux.it.net.cn 作者:IT
目录[-]
  • 1. Shell  引号
  • 1.1 单引号,双引号
  • 1.2 反引号
  • 1.3 反斜线
  • 2 执行脚本的三种方式

1. Shell  引号

shell 引用类型:

“”双引号

‘’单引号

··   反引号

\   反斜杠

1.1 单引号,双引号

单引号双引号区别:  除了类似作用,关键区别如下:

 

 
1
2
3
4
5
6
7
8
9
10
[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 ~]$

 

 

单引号与双引号类似,不同的是 s h e l l 会忽略任何引用值。换句话说,如果屏蔽了其特殊
含义,会将引号里的所有字符,包括引号都作为一个字符串。

1.2 反引号

 

 
1
2
3
4
5
6
7
8
[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 将反引号中的内容作为一个系统命令,并 执行其内容。

 

 

1.3 反斜线

如果下一个字符有特殊含义,反斜线防止 s h e l l 误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义: & * + ^ $ ` " | ?

 

2 执行脚本的三种方式

./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 更加具有移植性.

 
1
2
3
4
5
6
[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

 

 

 
1
2
3
4
5
6
[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

 

 

1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;


2、一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);


3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失
(并不能返回到父shell中)。


3、不用export定义的变量只对该shell有效,对子shell也是无效的。
(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容