Linux脚本:Shell

5/19/2022 运维操作系统Linux

目录


参考


# Shell脚本是什么

Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境。确切地说,Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至编写一些程序。

​ Shell 可以理解为 Linux 系统提供给用户的使用界面。当一个用户登录 Linux 之后,系统初始化程序 init 就根据 /etc/passwd 文件中的设定,为每个用户运行一个被称为 Shell(外壳)的程序。

​ Shell 处在内核与外层应用程序之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。下图 是 Linux 系统层次结构图,Shell 接收用户输入的命令,并把用户的命令从类似 abed 的 ASCII 码解释为类似 0101 的机器语言,然后把命令提交到系统内核处理;当内核处理完毕之后,把处理结果再通过 Shell 返回给用户。

img

​ 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
1

# Linux中执行shell脚本的方式

  • 第一种:(要进到shell脚本所在文件夹中)
sh helloworld.sh
1
  • 第二种:(要进到shell脚本所在文件夹中)
bash helloworld.sh
1
  • 第三种:(要进到shell脚本所在文件夹中)
./helloworld.sh
1
  • 第四种:
/home/data/helloworld.sh
1

注意:如果刚创建.sh文件,使用./ 或者绝对路径执行不了时,很可能是因为权限不够。此时你可以使用chmod命令来给shell文件授权。之后就能正常运行了。

chmod +x helloworld.sh
1

# Linux中shell脚本常用语法

# 参数表达式

$# : 传入脚本的参数个数;
$0 : 脚本自身的名称;  
$1 : 传入脚本的第一个参数;
$2 : 传入脚本的第二个参数;
$i : i是个变量,$i代表传入脚本的第i个参数;
$@ : 传入脚本的所有参数,将各个参数分别加双引号返回;
$* : 传入脚本的所有参数,以一对双引号给出参数列表;
$$ : 脚本执行的进程id;
$! : 代表最后执行的后台命令的进程id;
$? : 上一条命令执行后的状态,结果为0表示执行正常,结果为1表示执行异常;
$_ : 代表上一个命令的最后一个参数;
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旧,则为真。
1
2
3
4
5
6
7
8
9
10
11

# 整数表达式

-eq :等于
-ne :不等于
-gt :大于
-ge :大于等于
-lt :小于
-le :小于等于
1
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类似) 
1
2
3
4
5

# 逻辑表达式

if [ ! 表达式 ]            :逻辑非 !     条件表达式的相反
if [ ! -d $num ]          :逻辑非 ! -d  如果不存在目录$num
   
if [ 表达式1  –a  表达式2 ] :逻辑与 –a    条件表达式的并列
    
if [ 表达式1  –o 表达式2 ]  :逻辑或 -o    条件表达式的或
1
2
3
4
5
6

# 正则表达式

[[ ]]    :条件判断语句
=~       :正则匹百配,用来判断其左侧的参数是否符合右边的要求
^        :度以什么开头
^[0-9]   :以数字开头
^[0-9]+  :以数字开头,且数字有1到多个——加号表示1到多个
^[0-9]+$ :以1到多个数字开头,且结尾。——意即:只能有数字,不能问有其他字符
&&       :左边的条件满足,右边的命令才会执行。
1
2
3
4
5
6
7

# IF条件判断

1、基本语法:

if [ command ]; then
   符合该条件执行的语句
fi
1
2
3

2、扩展语法:

if [ command ];then
   符合该条件执行的语句
elif [ command ];then
   符合该条件执行的语句
else
   符合该条件执行的语句
fi
1
2
3
4
5
6
7

# shell中多个命令同时执行

linux shell 多个命令一起执行的几种方法

在Linux shell中,你可以使用不同的方式来执行多个命令。每种方式都有不同的行为和用途。

  1. ; 隔开命令:

    使用分号 ; 来隔开多个命令,这将导致所有命令按顺序执行,无论前一个命令是否成功。例如: command1 ; command2 ; command3 这会依次执行 command1command2command3,无论前一个命令是否成功。

  2. && 隔开命令:

    使用逻辑与运算符 && 来隔开多个命令,这将只有在前一个命令成功(返回状态码为0)时才执行下一个命令。例如: command1 && command2 && command3 这会依次执行 command1command2command3,只有在前一个命令成功时才会执行后续的命令。

  3. & 隔开命令:

    使用 ampersand & 来隔开多个命令,这将使每个命令在后台独立运行,不会等待前一个命令完成。例如: command1 & command2 & command3 这会同时启动 command1command2command3,它们会并行执行,并不会等待前一个命令完成。

总结: - 使用 ; 来分隔命令,适合需要按照顺序执行多个命令的情况,不论前一个命令是否成功。 - 使用 && 来分隔命令,适合需要依赖前一个命令成功才能执行下一个命令的情况。 - 使用 & 来分隔命令,适合需要并行执行多个命令的情况,不需要等待前一个命令完成。

多个命令同时执行的功能是由Linux shell提供的。Shell是一个命令行解释器,它允许用户与操作系统进行交互,并执行各种命令。在Linux系统中,常见的shell包括Bash(Bourne Again Shell)、Zsh(Z Shell)、Fish等。

Shell提供了不同的方式来执行多个命令,包括上面提到的使用分号(😉、逻辑与(&&)、以及后台运行(&)来隔开命令。这些功能允许用户根据需要顺序执行、条件执行或并行执行多个命令,增加了灵活性和效率。

因此,多个命令同时执行的功能是shell的一部分,而不是操作系统本身的功能。不同的shell可能会有一些细微的差异,但基本功能都是相似的。用户可以根据自己的需求选择合适的shell和命令组合来完成任务。

利用 "sh -c" 命令,它可以让 bash 将一个字串作为完整的命令来执行

上次更新时间: 9/25/2024, 1:19:15 AM