打印

执行Shell脚本的方式

[复制链接]
1328|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uiodh|  楼主 | 2013-1-31 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
执行Shell脚本的方式基本上有三种:

(1)输入定向到Shell脚本

这种方式是用输入重定向方式让Shell从给定文件中读入命令行并进行相应处理。其一般形式是:

$ bash < 脚本名<wolf评论:牛B,有空尝试一下!>

例如:

$ bash
Shell从文件ex1中读取命令行,并执行它们。当Shell到达文件末尾时就终止执行,并把控制返回到Shell命令状态。此时,脚本名后面不能带参数。

(2)以脚本名作为参数

其一般形式是:

$ bash 脚本名 [参数]
<wolf评论:该方式下脚本不具备执行权限也可以!>
例如:

$ bash ex2 /usr/meng /usr/zhang

其执行过程与上一种方式一样,但这种方式的好处是能在脚本名后面带有参数,从而将参数值传递给程序中的命令,使一个Shell脚本可以处理多种情况,就如同函数调用时可根据具体问题给定相应的实参。

如果以目前Shell(以·表示)执行一个Shell脚本,则可以使用如下简便形式:

$ · 脚本名 [参数]

以Shell脚本作为Shell的命令行参数,这种方式可用来进行程序调试。

(3)将Shell脚本的权限设置为可执行,然后在提示符下直接执行它。

通常用户是不能直接执行由正文编辑器(如vi)建立的Shell脚本的,因为直接编辑生成的脚本文件没有“执行”权限。如果要把Shell脚本直接当作命令执行,就需要利用命令chmod 将它置为有“执行”权限。例如,

$ chmod a+x ex2

就把Shell脚本ex2置为对所有用户都有“执行”权限。然后,在提示符后输入脚本名ex2就可直接执行该文件。注意,此时该脚本所在的目录应被包含在命令搜索路径(PATH)中。例如:

$ ex2
<wolf评论:注意PATH,如果该文件不在搜索路径中,则可以加路径运行,譬如./ex2!>
Shell 接收用户输入的命令(脚本名),并进行分析。如果文件被标记为可执行的,但不是被编译过的程序,Shell就认为它是一个Shell脚本。 Shell将 读取其中的内容,并加以解释执行。所以,从用户的观点看,执行Shell脚本的方式与执行一般的可执行文件的方式相似。

因此,用户开发的Shell脚本可以驻留在命令搜索路径的目录之下(通常是“/bin”、 “/usr/bin”等),像普通命令一样使用。这样,也就开发出自己的新命令。如果打算反复使用编好的Shell脚本,那么采用这种方式就比较方便。

Shell 脚本经常被用来执行重复性的工作,例如,当进入系统时要查看有无信件、列出谁在系统中、将工作目录改到指定目录并予以显示、印出当前日期等。完成这些工作 的命令是固定的。为了减少录入时间,可把这些命令建立在一个Shell脚本中,以后每次使用该文件名就可执行这些工作。

另外,完成某些固定工作时需输入的命令很复杂,例如文件系统的安装(mount),要带多个选项和参数。此时,利用Shell脚本存放该命令,以后用时就很方便了。


相关帖子

沙发
uiodh|  楼主 | 2013-1-31 10:22 | 只看该作者
wolf总结:
1、bash< 脚本名
2、bash 脚本名
3、./脚本名
这些方式还不够,且看下文

4 source  ./a.sh  
5 . ./a.sh(注意前面的 .

前两种方式(方法2/3)和后两种方式(方法4/5)的另外区别:如果你在一个脚本里export $KKK=111 ,如果你用./a.sh执行该脚本,执行完毕后,你运行 echo $KKK ,发现没有值,如果你用source来执行 ,然后再echo ,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是 source不同它就是在本shell中执行的,所以可以看到结果。
<wolf评论:.运行方式没讲,有空尝试一下与source方式是否相同>
# 执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出
# 一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)
# 用export定义的变量会被复制到该shell的子shell中
# 不用export定义的变量只对该shell有效,对子shell也是无效的。

余味未尽,且看下文
一个shell脚本test.sh的内容为:
【 #!/bin/bash
      export AA=123】
用sorcue 或者.(dot) 。明确告诉shell不要fork执行脚本,而是在当前的shell执行,这样环境变量就可以保存下来了。
source命令用法:
source Filename (通常用“.”来代替)
source test.sh 与 .test.sh是等效的。

Over!完美结局!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

95

帖子

0

粉丝