shell脚本文件夹内文件依次执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本文件夹内文件依次执行相关的知识,希望对你有一定的参考价值。

参考技术A 这个脚本非常简单,个人觉得也很实用,对于初学linux或者bash的小伙伴们,我觉得在很多地方可以解放我们的小手。
写的这个脚本是因为师弟师妹们有很多高斯文件需要计算,高斯的计算文件一般以 gjf 或者 com 结尾。所以要师弟师妹们把文件放到一个文件夹下,然后批量执行。
为了以后的方便我还写了通过识别后缀是否执行。脚本全文如下:

首先通过一个for循环结合 ls 查看文件命令依次读取文件,然后用一个 if 命令判定后缀是否后缀正确,
##*. 表示删除最后一个点以及左边的字符。

Shell脚本的执行方式详解

当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在加载了上述环境变量文件后,Shell就开始执行Shell脚本中的内容。

Shell脚本是从上至下、从左至右依次执行每一行的命令及语句的,即执行完了一个命令后再执行下一个,如果在Shell脚本中遇到子脚本(即脚本嵌套)时,就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。

通常情况下,在执行Shell脚本时,会向系统内核请求启动一个新的进程,以便在该进程中执行脚本的命令及子Shell脚本,基本流程如图:
技术图片

Shell脚本的执行通常可以采用以下几种方式:

1)bash script-name或sh script-name

这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法;

举例说明:

[root@localhost ~]# vim test.sh
echo ‘this is a shell scripts!‘
[root@localhost ~]# sh test.sh
this is a shell scripts!
[root@localhost ~]# bash test.sh 
this is a shell scripts!

2)path/script-name或./script-name

指在当前路径下执行脚本(脚本需要有执行权限),需要将脚本文件的权限先改为可执行(即文件权限属性加x位),具体方法为chmod+x script-name。然后通过脚本绝对路径或相对路径就可以直接执行脚本了;

举例说明:

[root@localhost ~]# ./test.sh
-bash: ./test.sh: 权限不够
[root@localhost ~]# chmod u+x test.sh
[root@localhost ~]# ./test.sh
this is a shell scripts!

这种方法比较麻烦一些!每次编写完脚本都必须给脚本一个执行的权限,否则将会提示“权限不够”的错误。

3)source script-name或.script-name

这种方法通常是使用source或“.”(点号)读入或加载指定的Shell脚本文件(如san.sh),然后,依次执行指定的Shell脚本文件san.sh中的所有语句。这些语句将在当前父Shell脚本father.sh进程中运行(其他几种模式都会启动新的进程执行子脚本)。因此,使用source或“.”可以将san.sh自身脚本中的变量值或函数等的返回值传递到当前父Shell脚本father.sh中使用。

举例说明:

[root@localhost ~]# chmod u-x test.sh
[root@localhost ~]# ll test.sh
-rw-r--r--. 1 root root 32 8月  26 03:09 test.sh
[root@localhost ~]# . test.sh
this is a shell scripts!
[root@localhost ~]# source test.sh
this is a shell scripts!

4)sh<script-name或cat scripts-name|sh

同样适用于bash,不过这种用法不是很常见,但有时也可以有出奇制胜的效果,例如:不用循环语句来实现精简开机自启动服务的案例,就是通过将所有字符串拼接为命令的形式,然后经由管道交给bash操作;

举例说明:

[root@localhost ~]# ll test.sh
-rw-r--r--. 1 root root 32 8月  26 03:09 test.sh
[root@localhost ~]# sh<test.sh
this is a shell scripts!
[root@localhost ~]# cat test.sh|bash
this is a shell scripts!

一个简单的例子明白第三种执行方式的特殊性:

[root@localhost ~]# echo ‘user=`whoami`‘ > test2.sh
[root@localhost ~]# cat test2.sh 
user=`whoami`
[root@localhost ~]# sh test2.sh 
[root@localhost ~]# echo $user

[root@localhost ~]# . test2.sh
[root@localhost ~]# echo $user
root

本人亲自尝试得出的结论有三点:

1.子Shell脚本会直接继承父Shell脚本的变量、函数(就好像是儿子随父亲姓,基因也会继承父亲的)等,反之则不可以;
2.如果希望反过来继承(就好像是让父亲随儿子姓,让父亲的基因也继承儿子的),就要用source或“.”在父Shell脚本中事先加载子Shell脚本;
3.通过source或“.”加载执行过的脚本,由于是在当前Shell中执行脚本,因此在脚本结束之后,脚本中的变量(包括函数)值在当前Shell中依然存在,而sh和bash执行脚本都会启动新的子Shell执行,执行完后退回到父Shell。因此,变量(包括函数)值等无法保留。在进行Shell脚本开发时,如果脚本中有引用或执行其他脚本的内容或配置文件的需求时,最好用“.”或source先加载该脚本或配置文件,处理完之后,再将它们加载到脚本的下面,就可以调用source加载的脚本及配置文件中的变量及函数等内容了。

以上是关于shell脚本文件夹内文件依次执行的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本应用(shell脚本基础与shell变量)

Shell脚本的执行方式详解

Shell脚本应用(shell脚本基础与shell变量)

shell脚本 循环

Linux操作系统Shell

shell脚本: 逐个压缩文件夹内所有文件和文件夹