shell脚本简介
常见的shell
常见的shell有sh、bash、csh、tcsh、ash
sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。
tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
bash
bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。
bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
基本操作
#查看shell
$ cat /etc/shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
#查看默认的shell环境
echo $SHELL
/bin/bash
第一个shell脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
输入一些代码,第一行一般是这样:
#!/bin/bash
echo "Hello World !"
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
运行 Shell 脚本有四种方法
-
作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
-
绝对路径执行脚本
/demo/shell/test.sh
-
作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh /bin/php test.php bash test.sh sh test.sh
-
在当前的shell环境中执行脚本
前缀使用
.
或者source
后面跟上脚本名称即可在当前shell环境执行. test.sh source test.sh
Shell配置文件加载
四种运行环境下的加载方式
-
交互式登录Shell、非交互式但有–login
将先读取/etc/profile,再依次搜索/.bash_profile、/.bash_login和/.profile,并仅加载第一个搜索到且可读的文件。当退出时,将执行/.bash_logout中的命令
-
交互式非登录Shell
读取/.bashrc,不会读取/etc/profile和/.bash_profile、/.bash_login和/.profile
-
非交互式非登录式Shell
不会加载前面所说的任何bash环境配置文件,但会搜索变量BASH_ENV,如果搜索到了,则加载其所指定的文件
-
远程Shell方式启动
属于非交互非登录式,但会加载~/.bashrc,所以还会加载/etc/bashrc,由于是非登录式,所以最终还会加载/etc/profile.d/*.sh,只不过因为是非交互式而使得执行的结果全部重定向到了/dev/null中
判断是否交互式、是否登录式
#判断变量PS1,非空则为交互式
echo $PS1
#on表示登录式,否则为非登录式
shopt login_shell
#或者
#判断变量"-",若值中包含有字母"i",则表示交互式
echo $-
shopt login_shell
运行结果
几种常见的Bash启动方式
-
正常登陆(伪终端登陆如ssh、虚拟终端)时,为交互式登陆shell
以下是通过xshell进行的登录
-
su命令,不带"–login"时为交互式、非登录式shell,带有login时为交互式登陆式shell
-
执行不带"–login"选项的bash命令时为交互式、非登录式shell,指定"–login"时,为交互式、登录式shell
-
使用命令组合(使用括号包围命令列表)以及命令替换进入子shell时,继承父shell的交互和登录属性
-
ssh执行远程命令,但不登录时,为非交互、非登录式shell
-
执行shell脚本时,为非交互、非登录式shell。但指定了"–login"时,将为非交互、登录式shell
执行上边代码
-
在图形界面下打开终端时,为交互式、非登录式shell