1、什么是Shell
Shell是一个命令解释器,解释用户对操作系统的操作。将用户输入的命令送到内核。有自己的编程语言对命令进行编辑并组织为程序。
本文内容同微信公众号【凡登】,关注不迷路,学习上高速,欢迎关注共同学习。
2、Shell的类型
可使用cat /etc/shells查看当前系统的shell, 这里我们主要围绕bash讲解
[@root ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
常见的Shell类型如下:
- Bourne Shell (/usr/bin/sh或/bin/sh) : 这是Unix系统的第一个shell,由Stephen Bourne在AT&T Bell实验室开发。它是最基本的shell,支持管道和输入/输出重定向,但没有提供很多其他的功能,例如函数、数组或进程替换等
- Bourne Again Shell (/bin/bash): 这是由Brian Fox和Brian Ratner开发的Unix shell。bash是Unix和Linux系统的默认shell,提供了许多 Bourne Shell 没有的功能,例如通配符扩展、函数、进程替换等。它是最常用的shell之一。
- C Shell (/usr/bin/csh): C Shell是由Bill Joy在伯克利大学开发的。它的语法类似C语言,支持程序式的编程,提供了很多内置命令,可以很方便地编写复杂的脚本。但是,它的一个缺点是脚本不易于阅读和理解。
- K Shell (/usr/bin/ksh) : K Shell是由David Korn在Bell实验室开发的。它结合了C Shell和Bourne Shell的优点,提供了很多功能,如数组、函数、命令替换等。它的语法比较直观,但比C Shell更易于阅读和理解。
- Shell for Root (/sbin/sh) : 这个shell是为根用户设计的,通常只在系统级别进行配置和管理时使用。它提供了比普通shell更强大的权限和功能,但一般用户不需要直接使用它。
- Zsh(Z-shell):Zsh是一种功能强大的Shell,它有许多额外的特性,如编程接口,更智能的命令行提示符,动态帮助,命令行编辑等。Zsh还有很强的扩展性,能够支持很多自定义功能
- PowerShell :PowerShell 是 Microsoft 开发的用于管理 Windows 系统的 Shell。它允许用户通过脚本执行一系列命令,以及管理和配置 Windows 系统
在一般情况下,并不区分Bourne Shell和Bourne Again Shell,像#!/bin/sh,它同样也可以改为#!/bin/bash。在Linux系统中,Bash是最常用的Shell,因为它的易用性和免费性。同时,Bash也是大多数Linux系统默认的Shell。本系列主要围绕Bash讲解,Bash官网
3、Shell脚本格式
- 文件名后缀建议以.sh 结尾
- 申明解释器,第一行一般以#!/bin/bash 或 #!/bin/sh 开头 指定由那个解释器执行脚本中的内容
- 中间是命令和变量
- 一行一个命令,一个命令做一件事
- 如果想把多个命令放在一行? 使用分号隔开,如: cd ~ ; pwd ; ls -l
- 以#开头表示注释
- 给脚本添加用户执行权限 chmod +x xx.sh
4、Hello World
# 编写脚本
[@root ~]# vim test.sh
#!/bin/bash
echo "Hello World" # 输出: Hello World
# 添加执行权限
[@root ~]# chmod u+x test.sh
# 执行脚本
[@root ~]# bash test.sh
Hello World
5、脚本执行方式
由于脚本中的内建命令可能会影响当前环境,所以不同的执行方式,产生的不一样的效果。
以下列举3中不同的执行方式
- bash xxx.sh 子进程运行脚本,不影响当前执行环境,脚本不需要执行权限
- ./xxx.sh 子进程运行脚本,不影响当前执行环境,脚本需要执行权限
- source ./xxx.sh 当前进程运行脚本,可能会影响当前环境,脚本不需要执行权限,source也可以简化为 .
如何理解子进程、当前进程,以及会影响当前环境?以下示例3种脚本不同执行方式
脚本test.sh内容
# 编写脚本
#!/bin/bash
cd /root/data # 进入/root/data目录
pwd # 输入当前目录
# 执行前查看脚本当前环境目录/root,记住
[@root ~]# pwd
/root
# 执行前查看当前脚本无执行权限
[@root ~]# ls -l test.sh
-rw-r--r-- 1 root root 29 10 12 17:33 test.sh
第一种运行方式:bash test.sh
# 执行脚步
[@root ~]# bash test.sh
/root/data
# 脚本执行过程中的路径已经变成/root/data ,执行后查看还是/root
[@root ~]# pwd
/root
说明:bash test.sh 方式执行脚本,通过演示执行脚本前后当前目录均为/root,说明此执行方式不会改变当前环境,
而脚本执行过程中目录由之前的/root 切换为/root/data 确实改变了,说明执行脚本前后不在一个执行环境
第二种运行方式./test.sh
[@root ~]# ./test.sh
-bash: ./test.sh: 权限不够
# 添加执行权限
[@root ~]# chmod u+x test.sh
-rwxr--r-- 1 root root 29 10 12 17:34 test.sh
# 再次执行
[@root ~]# ./test.sh
/root/data
# 脚本执行过程中的路径已经变/root/data ,执行后查看还是/root
[@root ~]# pwd
/root
说明:执行效果同脚本运行方式一,不同点./test.sh 方式 需要给脚本添加执行权限
第三种运行方式source test.sh
[@root ~]# source test.sh # 或执行 . ./test.sh
/root/data
# 脚本执行过程中的路径已经变/root/data ,执行后查看还是/root/data 执行脚本后当前环境路径已经变化
[@root ~]# pwd
/root/data
说明:执行脚本前后路径由/root 变为 /root/data 执行过程中和执行后均最终目录均为/root/data 即,表明当前脚本处于同一个运行环境中。
再次感谢您的阅读,欢迎关注微信公众号【凡登】共同学习。