shell脚本入门教程(shell 脚本教程)

LINUX快速入门第八章:Shell基础

我们平时所说的 Shell 可以理解为 Linux 系统提供给用户的使用界面。Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境。当一个用户登录 Linux 之后,系统初始化程序 init 就根据 /etc/passwd 文件中的设定,为每个用户运行一个被称为 Shell(外壳)的程序。

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

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

换句话说:

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 与其他 Linux 命令一样,都是实用程序,但它们之间还是有区别的。一旦用户注册到系统后,Shell 就被系统装入内存并一直运行到用户退出系统为止;而一般命令仅当被调用时,才由系统装入内存执行。

与一般命令相比,Shell 除了是一个命令行解释器,同时还是一门功能强大的编程语言,易编写,易调试,灵活性较强。作为一种命令级语言,Shell 是解释性的,组合功能很强,与操作系统有密切的关系,可以在 Shell 脚本中直接使用系统命令。大多数 Linux 系统的启动相关文件(一般在 /etc/rc.d 目录下)都是使用 Shell 脚本编写的。

同传统的编程语言一样,Shell 提供了很多特性,这些特性可以使 Shell 脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。

说了这么多,其实我们在 Linux 中操作的命令行界面就是 Linux 的 Shell,也就是 Bash,但是我们的图形界面是 Shell 吗?其实从广义讲,图形界面当然也是 Shell,因为它同样用来接收用户的操作,并传递到内核进行处理。不过,这里的 Shell 主要指的是 Bash。

Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。

Shell的分类

目前 Shell 的版本有很多种,如 Bourne Shell、C Shell、Bash、ksh、tcsh 等,它们各有特点,下面简要介绍一下。

最重要的 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 是广为流行的 Shell 变种。C Shell 主要在 BSD 版的 UNIX 系统中使用,发明者是柏克莱大学的 Bill Joy。C Shell 因为其语法和 C 语言类似而得名,这也使得 UNIX 的系统工程师在学习 C Shell 时感到相当方便。

Bourne Shell 和 C Shell 形成了 Shell 的两大主流派别,后来的变种大都吸取这两种 Shell 的特点,如 Korn、 tcsh 及 Bash。

Bash Shell 是 GNU 计划的重要工具之一,也是 GNU 系统中标准的 Shell。Bash 与 sh 兼容,所以许多早期开发出来的 Bourne Shell 程序都可以继续在 Bash 中运行。现在使用的 Linux 就使用 Bash 作为用户的基本 Shell。

Bash 于 1988 年发布,并在 1995-1996年推出Bash 2.0。在这之前,广为使用的版本是1.14,Bash 2.0增加了许多新的功能,以及具备更好的兼容性。表 2 中详细列出了各版本的具体情况。

注意,Shell 的两种主要语法类型有 Bourne 和 C,这两种语法彼此不兼容。Boume 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程序上支持 csh 的语法)。

本章讲述的脚本编程就是在 Bash 环境中进行的。不过,在 Linux 中除了可以支持 Bash,还可以支持很多其他的 Shell。我们可以通过 /etc/shells 文件来査询 Linux 支持的 Shell。命令如下:

在 Linux 中,这些 Shell 是可以任意切换的,命令如下:

用户信息文件 /etc/passwd 的最后一列就是这个用户的登录 Shell。命令如下:

大家可以看到,root 用户和其他可以登录系统的普通用户的登录 Shell 都是 /bin/bash,也就是 Linux 的标准 Shell,所以这些用户登录之后可以执行权限允许范围内的所有命令。不过,所有的系统用户(伪用户)因为登录 Shell 是 /sbin/ndogin,所以不能登录系统。

笔记:

sh/bash/csh/Tcsh/ksh/pdksh等shell的区别

编写shell脚本的基本步骤是什么?

shell脚本只是命令操作的集合。就是把你手动交互输入的命令放在一个文件里,自动依次执行。

步骤大约如下:

1. 在行首指定shell脚本的解析器,如 #!/bin/bash

2. 接着依次每行输入shell的操作命令

3. 输入完毕后,给文件设置可执行权限并运行。

shell脚本入门教程(shell 脚本教程)  第1张

如何运行shell脚本

编写好的shell脚本(如:test),可以采取两种方式进行运行:\x0d\x0a一、 $ sh test\x0d\x0a一般不采用这种调用方式,尤其不采用“shtest”的调用方式,因为这种方式将禁止shell读取标准输入。\x0d\x0a也可以采用 $ ksh test\x0d\x0a这种方式要求shell具有“可读”的访问权限。\x0d\x0a二、直接运行可执行的shell脚本之前,首先应使用下列chmod命令,把shell脚本文件设置为可执行的文件。\x0d\x0achmod 755 test(除文件属主可写之外,每个用户均具有读和可执行的访问权限)\x0d\x0achmod +rx test(同上)\x0d\x0achmod u+rx test(只有文件属主具有读和执行的访问权限)\x0d\x0a按照上述要求设置shell脚本文件的访问权限后,可采用下列方式,直接运行shell脚本了。\x0d\x0a1、test(如果命令检索路径包含当前目录)\x0d\x0a2、./test(如果命令减缩路径不包含当前目录)\x0d\x0a*说明: sh test 方式调用一个shell叫蹦可能会禁止某些shell特定的扩展功能,因而可能引起脚本无法正确执行。

Shell脚本应该怎么使用

1、用鼠标对shell脚本点右键-》属性-》权限,显示下图

2、将“允许以程序执行文件”的选项打勾

3、即可在终端中执行脚本

shell脚本书写方法

在shell学习过程中,感觉挺有用的一份比较,略整理分享给大家。

首先,shell的作用

用户的登陆shell 登陆后默认的shell程序是: /bin/bash

不同的shell内部指令,运行环境会有所区别

常见的shell有

/bin/sh

/bin/bash

/sbin/nologin

1.编写脚本代码:

使用vi编辑器,每行一条Linux命令,按照顺序执行

2.然后赋予脚本文件可执行的属性

3.执行脚本文件的三种方法

./chao.sh

sh /chao.sh

source /chao.sh

更完善的脚本构成

注释信息

可执行语句

重定向操作

类型 操作符 用途

重定向输入 从指定文件读取而不是从键盘输入

重定向输出 将输出文件保存到指定文件(覆盖原有内容)

将输出文件保存到指定文件(覆盖原有内容)

标准错误输出 2 将错误信息保存到指定的文件(覆盖原有内容)

2 将错误信息保存到指定的文件

混合输出 将标准输出,标准错误的内容保存到同一文件中

管道操作符号“|”

将左侧的命令输出结果,作为右侧命令的处理对象

shell变量的作用

为灵活管理Linux系统提供的特定参数,有两层意思

变量名:使用固定的名称,由系统预设或用户定义

变量值: 能够根据用户设置,系统环境的变化而变化

变量的类型

自定义变量:由用户自己定义,修改和使用

环境变量: 由系统维护,用于设置工作环境

位置变量: 通过命令行给脚本程序传递参数

预定义变量:BASH中内置的一类变量,不能直接修改

定义一个新的变量

格式: 变量名=变量值

变量名以字母或下划线开头,区分大小写,建议全大写

查看变量的值: echo $变量名

赋值时使用引号:

双引号:允许使用$符引用其他变量值

单引号: 禁止引用其他变量值,$视为普通字符

反撇号:命令替换,提取命令执行后的输出结果

将键盘输入内容为变量赋值

格式: read [-p "提示信息"] 变量名

设置变量的作用范围

export 变量名

export 变量名=变量值

两种格式可以混合使用

整数变量的运算:

expr 变量1 运算符 变量2 [运算符 变量3]

常见的运算符

加法运算符 +

减法运算符: -

乘法运算符:\*

除法运算符: /

取余运算:%

整数变量的运算(2)

((变量=变量运算符变量));

等号后面的变量可以是具体数值

例子:

((a=a+3));

环境变量:

由系统提前创建,用来设置用户的工作环境

配置文件: /etc/profile ~/.bash_profile

常见环境变量的举例

位置变量:

表示为$n, n为1~9之间的数字

预定义变量:

/etc/passwd /etc/shadow

例如一些服务的内置用户名或密码

如apache的启动用户就是预定义变量

条件测试操作

测试特定的 表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值

格式 : test 条件表达式

应用实例:

test -z 进行测试的时候 字符串长度为0的时候 结果才返回1

如果变量数值为0 返回0

条件测试操作

[ 操作符 文件或目录]

[5] 部分是判断表达式,-d表示判断是否是目录

是”逻辑与“操作符,只有前面的判断成立,后面的语句才会执行

-b的意思是判断 后面的路径是否是一个目录

echo $? 表示对刚刚执行的表达式进行判断

0表示成立,1表示不成立

-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]

-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]

-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]

-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]

-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]

-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]

-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]

filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string 如果 string长度为零,则为真 [ -z "$myvar" ]

-n string 如果 string长度非零,则为真 [ -n "$myvar" ]

string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]

string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]

算术比较运算符

num1-eq num2 等于 [ 3 -eq $mynum ]

num1-ne num2 不等于 [ 3 -ne $mynum ]

num1-lt num2 小于 [ 3 -lt $mynum ]

num1-le num2 小于或等于 [ 3 -le $mynum ]

num1-gt num2 大于 [ 3 -gt $mynum ]

num1-ge num2 大于或等于 [ 3 -ge $mynum ]

整数值比较

格式: [ 整数1 操作符 整数2 ]

字符串比较

格式1: [ 字符串1 = 字符串2 ]

[ 字符串1 != 字符串2 ]

格式2: [ -z 字符串 ]

逻辑测试:

格式1: [ 表达式1 ] 操作符 [ 表达式2 ]

格式2: 命令1 操作符 命令2

if语句的结构

while语句的语法结构

工具篇-shell脚本编程快速入门(over)

参考:《shell脚本-菜鸟教程》

在shell中运算符分为以下几种:

注意:

原生的bash是不支持数学运算的,所以我们需要借助其他的命令帮助我们去执行,最常用的就是 expr ,这是一款表达式计算工具,可以帮助我们去完成求值操作。例如:

从图中可知 两数相加 运算符中间必须要有空格,否则无法计算

对布尔结果进行计算

案例

结果如下:

对字符串进行逻辑判断。

案例

结果如下:

在linux中,一切皆文件,因此我们可以对进行进行一些逻辑操作

案例:

结果如下:

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-24
下一篇 2023-09-24

相关推荐

发表回复

登录后才能评论