Shell基本概述

Shell基本概述

什么是Shell

Shell是命令解释器,它的作用是解释和执行用户输入的命令及程序等,用户输入一条命令,Shell就解释执行一条。

Shell存在于操作系统的最外层,负责直接与用户对话,把用户输入的命令解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户,当我们输入系统用户名和密码,登录到Linux后的所有操作都是由Shell解释并执行的。

Shell命令是存在交互式和非交互式的两种方式
交互式模式就是在终端上执行,Shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式,是因为Shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,Shell也终止了。

非交互式模式,以Shell Script(非交互)方式执行。在这种模式下,Shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,Shell也就终止了。

可以通过打印"$-"变量的值(代表着当前设置的Shell选项),来区分交互式与非交互式Shell。

[root@shell ~]# cat 1.sh 
\#!bin/bash
echo $-
[root@shell ~]# sh 1.sh 
hB
[root@shell ~]# echo $-
himBH
[root@shell ~]# 

#各个字符所代表的含义:

01)h:hashall,打开这个选项后,Shell会将命令所在的路径记录下来,避免每次都要查询。

02)i:interactive,包含这个选项说明当前的Shell是一个交互式的Shell。

03)m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。

04)B:braceexpand,大括号扩展。

05)H:history,Shell会把我们执行的命令记录下来,可以通过history命令查看。

Shell脚本概念

01)系统的命令堆积在一起,按照顺序执行。
02)特定的格式 + 特定的语法 + 系统的命令 = 文件
03)以.sh为结尾的文件

Shell脚本行业规范

Shell脚本开发规范及习惯非常重要,虽然这些规范不是必须要遵守的,但有了好的规范和习惯,可以大大提升开发效率,并降低后期对脚本的维护成本。当多人协作开发时,大家有一个互相遵守的规范就显得更重要了。哪怕是一个人开发,最好也采取一套固定的规范,这样脚本更易读、易于后期维护,最主要的是要让自己养成一个一出手就是专业和规范的习惯。

01)脚本放在放在统一的目录
# mkdir -p /scripts/

02)推荐使用vim编辑器编辑脚本(高亮显示)

03)以.sh为扩展名

04)规范的Shell脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容。

#!/bin/bash 或 #!/bin/sh #如不指定Shell,默认以bash执行。

05)开头的"#!"称为幻数,在执行Shell脚本的时候,内核会根据"#!"后的解释器来确定使用哪个程序解释脚本中的内容。注意:这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行。

06)附带作者及版权信息。

07)脚本注释:在Shell脚本中,跟在"#"后面的内容表示注释。注释部分不会被执行,仅给人看。注释可以自成一行,也可以跟在命令后面,与命令同行。要养成写注释的习惯,方便自己与他人。最好不用中文注释,因为在不同字符集的系统会出现乱码。

08)成对的符号一次书写完成。

09)循环的格式一次书写完成。

Shell脚本的执行方式

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

通常情况下,当Shell脚本执行时,会向系统内核请求启动一个新的进程,以便在该进程中执行脚本的命令以及子Shell脚本。

Shell脚本的执行方式分为以下几种

1)bash script-name或sh #无需执行权限

[root@shell ~]# cat test1.sh 
#!/bin/bash
pwd
[root@shell ~]# sh test1.sh 
/root
[root@shell ~]# ll test1.sh 
-rw-r--r-- 1 root root 16 Oct 19 03:48 test1.sh

2)path/script-name或./script-name #必须要有执行权限

[root@shell ~]# ll test1.sh 
-rw-r--r-- 1 root root 16 Oct 19 03:48 test1.sh
[root@shell ~]# ./test1.sh
-bash: ./test1.sh: Permission denied
[root@shell ~]# chmod +x test1.sh
[root@shell ~]# ./test1.sh
/root
[root@shell ~]# ll test1.sh 
-rwxr-xr-x 1 root root 16 Oct 19 03:48 test1.sh
[root@shell ~]# 

3)source script-name或. #将脚本里的代码调入到当前环境运行,无需执行权限

[root@shell ~]# cat test.sh
#!bin/bash
ping baidu.com
[root@shell ~]# sh test.sh >/dev/null
#另打开一个会话窗口查看进程

[root@shell ~]# ps -ef|grep test.sh
root 13351 13263 0 22:42 pts/2 00:00:00 sh test.sh
root 13387 13355 0 22:43 pts/0 00:00:00 grep --color=auto test.sh
#使用source来执行脚本

[root@shell ~]# source test.sh >/dev/null
#另一个会话窗口查看进程

[root@shell ~]# ps -ef|grep test.sh
root 13394 13355 0 22:43 pts/0 00:00:00 grep --color=auto test.sh
[root@shell ~]# ps -ef|grep ping
root 15616 13965 0 09:47 pts/0 00:00:00 ping baidu.com
root 15620 15591 0 09:47 pts/1 00:00:00 grep --color=auto ping

4)cat script-name |bash #将脚本里的代码调入到当前环境运行,无需执行权限

5)bash < script-name #将脚本里的代码调入到当前环境运行,无需执行权限

登录式Shell和非登录式Shell

登录shell:是需要用户名、密码登录后才能进入的Shell。

非登录shell:当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令"bash"就是打开一个新的非登录Shell,在Gnome或KDE中打开一个"终端"(terminal)窗口程序也是一个非登录Shell。

执行exit命令,退出一个Shell(登录或非登录Shell);执行logout命令,退出登录Shell(不能退出非登录Shell)。

/etc/profile文件是登录Shell启动后运行的第一个启动脚本,它只为登录Shell运行;非登录Shell不会引发这个脚本。

登录式shell配置文件执行顺序

/etc/profile->/etc/profile.d/*.sh->/.bash_profile->/.bashrc->/etc/bashrc

每个调用的脚本会依次撤销前一个调用脚本中的改变,在退出登录Shell时,我们还可以执行某些任务,如创建自动备份、清除临时文件。把这些任务放在.bash_logout文件中。

非登录式shell配置文件执行顺序

~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh

PS:验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行。

posted @ 2019-11-19 22:25  Wesley·  阅读(269)  评论(0)    收藏  举报