Shell 第二天

1. Shell  引号

shell 引用类型:

“”双引号

‘’单引号

··   反引号

\   反斜杠

1.1 单引号,双引号

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

[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 反引号

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

[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



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


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


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


3、不用export定义的变量只对该shell有效,对子shell也是无效的。

转载于:https://my.oschina.net/hanruikai/blog/223441

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值