Linux脚本:Shell
目录
参考
- 链接1:Shell脚本是什么 (opens new window)
- 链接2:https://blog.csdn.net/jialiu111111/article/details/125142697 (opens new window)
- 链接3:shell中多个命令同时执行 (opens new window)
# Shell脚本是什么
Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境。确切地说,Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至编写一些程序。
Shell 可以理解为 Linux 系统提供给用户的使用界面。当一个用户登录 Linux 之后,系统初始化程序 init 就根据 /etc/passwd 文件中的设定,为每个用户运行一个被称为 Shell(外壳)的程序。
Shell 处在内核与外层应用程序之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。下图 是 Linux 系统层次结构图,Shell 接收用户输入的命令,并把用户的命令从类似 abed 的 ASCII 码解释为类似 0101 的机器语言,然后把命令提交到系统内核处理;当内核处理完毕之后,把处理结果再通过 Shell 返回给用户。
Shell 与其他 Linux 命令一样,都是实用程序,但它们之间还是有区别的。一旦用户注册到系统后,Shell 就被系统装入内存并一直运行到用户退出系统为止;而一般命令仅当被调用时,才由系统装入内存执行。与一般命令相比,Shell 除了是一个命令行解释器,同时还是一门功能强大的编程语言,易编写,易调试,灵活性较强。作为一种命令级语言,Shell 是解释性的,组合功能很强,与操作系统有密切的关系,可以在 Shell 脚本中直接使用系统命令。大多数 Linux 系统的启动相关文件(一般在 /etc/rc.d 目录下)都是使用 Shell 脚本编写的。同传统的编程语言一样,Shell 提供了很多特性,这些特性可以使 Shell 脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。
其实我们在 Linux 中操作的命令行界面就是 Linux 的 Shell,也就是 Bash,但是我们的图形界面是 Shell 吗?其实从广义讲,图形界面当然也是 Shell,因为它同样用来接收用户的操作,并传递到内核进行处理。不过,这里的 Shell 主要指的是 Bash。
# Shell脚本的分类
目前 Shell 的版本有很多种,如 Bourne Shell、C Shell、Bash、ksh、tcsh 等,它们各有特点,下表中详细列出了各版本的具体情况。
Shell类别 | 易学性 | 可移植性 | 编辑性 | 快捷性 |
---|---|---|---|---|
Boume Shell (sh) | 容易 | 好 | 较差 | 较差 |
Korn Shell (ksh) | 较难 | 较好 | 好 | 较好 |
Boume Again (Bash) | 难 | 较好 | 好 | 好 |
POSIX Shell (psh) | 较难 | 好 | 好 | 较好 |
C Shell (csh) | 较难 | 差 | 较好 | 较好 |
TC Shell (tcsh) | 难 | 差 | 好 | 好 |
Z Shell (zsh) | 难 | 差 | 好 | 好 |
# Bourne Shell
最重要的 Shell 是 Bourne Shell,这个命名是为了纪念此 Shell 的发明者 Steven Bourne。从 1979 年起,UNIX 就开始使用 Boume Shell。Bourne Shell 的主文件名为 sh,开发人员便以 sh 作为 Bourne Shell 的主要识别名称。
虽然 Linux 与 UNIX 一样,可以支持多种 Shell,但 Boume Shell 的重要地位至今仍然没有改变,许多 UNIX 系统中仍然使用 sh 作为重要的管理工具。它的工作从开机到关机,几乎无所不包。在 Linux 中,用户 Shell 主要是 Bash,但在启动脚本、编辑等很多工作中仍然使用 Bourne Shell。
# C Shell
C Shell 是广为流行的 Shell 变种。C Shell 主要在 BSD 版的 UNIX 系统中使用,发明者是柏克莱大学的 Bill Joy。C Shell 因为其语法和 C 语言类似而得名,这也使得 UNIX 的系统工程师在学习 C Shell 时感到相当方便。
# Bash Shell
Bash Shell 是 GNU 计划的重要工具之一,也是 GNU 系统中标准的 Shell。Bash 与 sh 兼容,所以许多早期开发出来的 Bourne Shell 程序都可以继续在 Bash 中运行。现在使用的 Linux 就使用 Bash 作为用户的基本 Shell。
# Bash
Bash 于 1988 年发布,并在 1995-1996年推出Bash 2.0。在这之前,广为使用的版本是1.14,Bash 2.0增加了许多新的功能,以及具备更好的兼容性。
注意:
Bourne Shell 和 C Shell 形成了 Shell 的两大主流派别,后来的变种大都吸取这两种 Shell 的特点,如 Korn、 tcsh 及 Bash。
Bourne Shell 和 C Shell 这两种语法彼此不兼容。Boume 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程序上支持 csh 的语法)。
# Linux中的Shell脚本
在 Linux 中除了可以支持 Bash,还可以支持很多其他的 Shell。可以通过 /etc/shells 文件来査询 Linux 支持的 Shell。
vim /etc/shells
# Linux中执行shell脚本的方式
- 第一种:(要进到shell脚本所在文件夹中)
sh helloworld.sh
- 第二种:(要进到shell脚本所在文件夹中)
bash helloworld.sh
- 第三种:(要进到shell脚本所在文件夹中)
./helloworld.sh
- 第四种:
/home/data/helloworld.sh
注意:如果刚创建.sh文件,使用./ 或者绝对路径执行不了时,很可能是因为权限不够。此时你可以使用chmod命令来给shell文件授权。之后就能正常运行了。
chmod +x helloworld.sh
# Linux中shell脚本常用语法
# 参数表达式
$# : 传入脚本的参数个数;
$0 : 脚本自身的名称;
$1 : 传入脚本的第一个参数;
$2 : 传入脚本的第二个参数;
$i : i是个变量,$i代表传入脚本的第i个参数;
$@ : 传入脚本的所有参数,将各个参数分别加双引号返回;
$* : 传入脚本的所有参数,以一对双引号给出参数列表;
$$ : 脚本执行的进程id;
$! : 代表最后执行的后台命令的进程id;
$? : 上一条命令执行后的状态,结果为0表示执行正常,结果为1表示执行异常;
$_ : 代表上一个命令的最后一个参数;
2
3
4
5
6
7
8
9
10
11
# 文件表达式
-e filename :如果 filename存在,则为真
-d filename :如果 filename为目录,则为真
-f filename :如果 filename为常规文件,则为真
-L filename :如果 filename为符号链接,则为真
-r filename :如果 filename可读,则为真
-w filename :如果 filename可写,则为真
-x filename :如果 filename可执行,则为真
-s filename :如果文件长度不为0,则为真
-h filename :如果文件是软链接,则为真
filename1 -nt filename2 :如果 filename1比 filename2新,则为真。
filename1 -ot filename2 :如果 filename1比 filename2旧,则为真。
2
3
4
5
6
7
8
9
10
11
# 整数表达式
-eq :等于
-ne :不等于
-gt :大于
-ge :大于等于
-lt :小于
-le :小于等于
2
3
4
5
6
# 字符串表达式
If [ $a = $b ] :如果string1等于string2,则为真,字符串允许使用赋值号做等号
if [ $string1 != $string2 ] :如果string1不等于string2,则为真
if [ -n $string ] :如果string 非空(非0),返回0(true)
if [ -z $string ] :如果string 为空,则为真
if [ $sting ] :如果string 非空,返回0 (和-n类似)
2
3
4
5
# 逻辑表达式
if [ ! 表达式 ] :逻辑非 ! 条件表达式的相反
if [ ! -d $num ] :逻辑非 ! -d 如果不存在目录$num
if [ 表达式1 –a 表达式2 ] :逻辑与 –a 条件表达式的并列
if [ 表达式1 –o 表达式2 ] :逻辑或 -o 条件表达式的或
2
3
4
5
6
# 正则表达式
[[ ]] :条件判断语句
=~ :正则匹百配,用来判断其左侧的参数是否符合右边的要求
^ :度以什么开头
^[0-9] :以数字开头
^[0-9]+ :以数字开头,且数字有1到多个——加号表示1到多个
^[0-9]+$ :以1到多个数字开头,且结尾。——意即:只能有数字,不能问有其他字符
&& :左边的条件满足,右边的命令才会执行。
2
3
4
5
6
7
# IF条件判断
1、基本语法:
if [ command ]; then
符合该条件执行的语句
fi
2
3
2、扩展语法:
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
2
3
4
5
6
7
# shell中多个命令同时执行
linux shell 多个命令一起执行的几种方法
在Linux shell中,你可以使用不同的方式来执行多个命令。每种方式都有不同的行为和用途。
用
;
隔开命令:使用分号
;
来隔开多个命令,这将导致所有命令按顺序执行,无论前一个命令是否成功。例如: command1 ; command2 ; command3 这会依次执行command1
、command2
和command3
,无论前一个命令是否成功。用
&&
隔开命令:使用逻辑与运算符
&&
来隔开多个命令,这将只有在前一个命令成功(返回状态码为0)时才执行下一个命令。例如: command1 && command2 && command3 这会依次执行command1
、command2
和command3
,只有在前一个命令成功时才会执行后续的命令。用
&
隔开命令:使用 ampersand
&
来隔开多个命令,这将使每个命令在后台独立运行,不会等待前一个命令完成。例如: command1 & command2 & command3 这会同时启动command1
、command2
和command3
,它们会并行执行,并不会等待前一个命令完成。
总结:
- 使用 ;
来分隔命令,适合需要按照顺序执行多个命令的情况,不论前一个命令是否成功。
- 使用 &&
来分隔命令,适合需要依赖前一个命令成功才能执行下一个命令的情况。
- 使用 &
来分隔命令,适合需要并行执行多个命令的情况,不需要等待前一个命令完成。
多个命令同时执行的功能是由Linux shell提供的。Shell是一个命令行解释器,它允许用户与操作系统进行交互,并执行各种命令。在Linux系统中,常见的shell包括Bash(Bourne Again Shell)、Zsh(Z Shell)、Fish等。
Shell提供了不同的方式来执行多个命令,包括上面提到的使用分号(😉、逻辑与(&&)、以及后台运行(&)来隔开命令。这些功能允许用户根据需要顺序执行、条件执行或并行执行多个命令,增加了灵活性和效率。
因此,多个命令同时执行的功能是shell的一部分,而不是操作系统本身的功能。不同的shell可能会有一些细微的差异,但基本功能都是相似的。用户可以根据自己的需求选择合适的shell和命令组合来完成任务。
利用 "sh -c" 命令,它可以让 bash 将一个字串作为完整的命令来执行