当前位置:文档之家› linux编写systemd下服务脚本

linux编写systemd下服务脚本

linux编写systemd下服务脚本
linux编写systemd下服务脚本

linux编写systemd下服务脚本

Red Hat Enterprise Linux 7(RHEL 7)已经将服务管理工具从SysVinit和Upstart迁移到了systemd上,相应的服务脚本也需要改变。前面的版本里,所有的启动脚本都是放在/etc/rc.d/init.d/ 目录下。这些脚本都是bash脚本,可以让系统管理员控制这些服务的状态,通常,这些脚本中包含了start,stop,restart这些方法,以提供系统自动调用这些方法。但是在RHEL 7中当中已经完全摒弃了这种方法,而采用了一种叫unit的配置文件来管理服务。

1.Systemd下的unit文件

Unit文件专门用于systemd下控制资源,这些资源包括服务(service)、套接字(socket)、设备(device)、挂载点(mount point)、自动挂载点(automount point)、交换文件或分区(a swap file or partition)…

所有的unit文件都应该配置[Unit]或者[Install]段.由于通用的信息在[Unit]和[Install]中描述,每一个unit应该有一个指定类型段,例如[Service]来对应后台服务类型unit.

1.1.unit 类型如下:

service :守护进程的启动、停止、重启和重载是此类unit 中最为明显的几个类型。

socket :此类unit 封装系统和互联网中的一个socket。当下,systemd支持流式, 数据报和连续包的AF\_INET,AF\_INET6,AF\_UNIXsocket 。也支持传统的FIFOs 传输模式。每一个socket unit 都有一个相应的服务unit 。相应的服务在第一个“连接”进入socket 或FIFO 时就会启动(例如:nscd.socket 在有新连接后便启动nscd.service)。

device :此类unit 封装一个存在于Linux设备树中的设备。每一个使用udev 规则标记的设备都将会在systemd 中作为一个设备unit 出现。udev 的属性设置可以作为配置设备unit 依赖关系的配置源。

mount :此类unit 封装系统结构层次中的一个挂载点。

automount :此类unit 封装系统结构层次中的一个自挂载点。每一个自挂载unit 对应一个已挂载的挂载unit (需要在自挂载目录可以存取的情况下尽早挂载)。

target :此类unit 为其他unit 进行逻辑分组。它们本身实际上并不做什么,只是引用其他unit 而已。这样便可以对unit 做一个统一的控制。(例如:multi-user.target 相当于

在传统使用SysV 的系统中运行级别5);bluetooth.target 只有在蓝牙适配器可用的情况下才调用与蓝牙相关的服务,如:bluetooth 守护进程、obex 守护进程等)snapshot :与targetunit 相似,快照本身不做什么,唯一的目的就是引用其他unit 。

2.认识service的unit文件

2.1.扩展名:.service

路径:

/etc/systemd/system/* ―――― 供系统管理员和用户使用

/run/systemd/system/* ―――― 运行时配置文件

/usr/lib/systemd/system/* ―――― 安装程序使用(如RPM包安装)

以下是一段service unit文件的例子,属于/usr/lib/systemd/system/NetworkManager.service文件,它描述的是系统中的网络管理服务。

[Unit]

Description=Network Manager

Wants=network.target

Before=network.target network.service

[Service]

Type=dbus

BusName=https://www.doczj.com/doc/a94539251.html,workManager

ExecStart=/usr/sbin/NetworkManager --no-daemon

# NM doesn't want systemd to kill its children for it

KillMode=process

[Install]

WantedBy=multi-user.target

Alias=https://www.doczj.com/doc/a94539251.html,workManager.service

Also=NetworkManager-dispatcher.service

整个文件分三个部分,[Unit]·[Service]·[Install]

[Unit]:记录unit文件的通用信息。

[Service]:记录Service的信息

[Install]:安装信息。

3.Unit主要包含以下内容:

●Description:对本service的描述。

●Before, After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动。

●Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制某单元与它“需要”的单元的启动顺序(启动顺序是另外控制的),即Systemd 不是先启动Requires 再启动本单元,而是在本单元被激活时,并行启动两者。于是会产生争分夺秒的问题,如果Requires 先启动成功,那么皆大欢喜; 如果Requires 启动得慢,那本单元就会失败(Systemd 没有自动重试)。所以为了系统的健壮性,不建议使用这个标记,而建议使用Wants 标记。可以使用多个Requires。

●RequiresOverridable:跟Requires 很像。但是如果这条服务是由用户手动启动的,那么RequiresOverridable 后面的服务即使启动不成功也不报错。跟Requires 比增加了一定容错性,但是你要确定你的服务是有等待功能的。另外,如果不由用户手动启动而是随系统开机启动,那么依然会有Requires 面临的问题。

●Requisite:强势版本的Requires。要是这里需要的服务启动不成功,那本单元文件不管能不能检测等不能等待都立刻就会失败。

●Wants:推荐使用。本单元启动了,它“想要”的单元也会被启动。但是启动不成功,对本单元没有影响。

●Conflicts:一个单元的启动会停止与它“冲突”的单元,反之亦然。

4.Service主要包含以下内容:

●Type:service的种类,包含下列几种类型:

----simple默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切都退出。

-----forking 标准Unix Daemon 使用的启动方式。启动程序后会调用fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程

-----oneshot种服务类型就是启动,完成,没进程了。

notify,idle类型比较少见,不介绍。

●ExecStart:服务启动时执行的命令,通常此命令就是服务的主体。

------如果你服务的类型不是oneshot,那么它只可以接受一个命令,参数不限。

------多个命令用分号隔开,多行用\ 跨行。

●ExecStartPre, ExecStartPost:ExecStart执行前后所调用的命令。

●ExecStop:定义停止服务时所执行的命令,定义服务退出前所做的处理。如果没有指定,使用systemctl stop xxx命令时,服务将立即被终结而不做处理。

●Restart:定义服务何种情况下重启(启动失败,启动超时,进程被终结)。可选选项:no, on-success, on-failure,on-watchdog, on-abort

●SuccessExitStatus:参考ExecStart中返回值,定义何种情况算是启动成功。

eg:SuccessExitStatus=1 2 8 SIGKILL

Install主要包含以下内容:

●WantedBy:何种情况下,服务被启用。

eg:WantedBy=multi-user.target(多用户环境下启用)

●Alias:别名

■旧的命令与systemd命令的映射

5.创建自己的systemd服务

弄清了unit文件的各项意义,我们可以尝试编写自己的服务,与以前用SysV来编写服务相比,整个过程比较简单。unit文件有着简洁的特点,是以前臃肿的脚本所不能比的。

在本例中,尝试写一个命名为my-demo.service的服务,整个服务很简单:在开机的时候将服务启动时的时间写到一个文件当中。可以通过这个小小的例子来说明整个服务的创建过程。

5.1.Step1:

编写属于自己的unit文件,命令为my-demo.service,整个文件如下:

5.2.Step2:

将上述的文件拷贝到RHEL 7系统中/usr/lib/systemd/system/*目录下

5.3.Step3:

编写unit文件中ExecStart=/bin/bash /root/test.sh所定义的test.sh文件,将其放在定义的目录当中,此文件是服务的执行主体。文件内容如下:

#!/bin/bash

date >> /tmp/date

5.4.Step4:

将my-demo.service注册到系统当中执行命令:

# systemctl enable my-demo.service

输出:ln -s'/usr/lib/systemd/system/my-demo.service' '/etc/systemd/system/multi-user.target.wants/my-demo.service'

输出表明,注册的过程实际上就是将服务链接到/etc/systemd/system/目录下。

至此服务已经创建完成。重新启动系统,会发现/tmp/date文件已经生成,服务在开机时启动成功。当然本例当中的test.sh文件可以换成任意的可执行文件作为服务的主体,这样就可以实现各种各样的功能。

Linux实验项目四--shell编程

实验项目四shell编程 一、实验目的 (1)了解shell的作用和主要分类; (2)掌握bash的建立和执行方式; (3)掌握bash的基本语法; (4)学会编写shell脚本。 二、实验内容 (1)shell脚本的建立和执行; (2)历史命令和别名定义; (3)shell变量和位置参数、环境变量; (4)bash的特殊字符; (5)一般控制结构; (6)算术运算及bash函数。 三.实验软件 VMWare Workstation 5.0; Red hat linux 9.0; 四.实验主要步骤 1、利用vi建立一个脚本文件,其中包括date,cal,pwd,ls等常用命令。然后以不同方式执行脚本。 2、运行history命令,配置历史命令环境。 3、体会bash的命令补齐功能。 4、用alias定义别名,然后执行。 5、编辑如下脚本进行执行: 6、编写一个shell脚本,求斐波那契数列的前10项及总和。 7、设计一个程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围的数据,n和m都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。例如: $cuts 11 14 tis is a test of cuts program (输入) tst(显示结果

五.实验结果 1、利用vi建立一个脚本文件,其中包括date,cal,pwd,ls等常用命令。然后以不同方式执行脚本。 2、运行history命令,配置历史命令环境。 3、体会bash的命令补齐功能。 双击tab键,能列出所有符合条件的结果,只有唯一结果时单击可补全。 4、用alias定义别 名,然后执行。 5、编辑如下脚本进行执行:

Shell脚本编写基础

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell 是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。可以说,shell使用的熟练程度反映了用户对Linux使用的熟练程度。 一、什么是shell 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shel l(外壳)的程序。那么,shell是什么呢?确切一点说,shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell 来启动、挂起、停止甚至是编写一些程序。 当用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。shell解释用户输入的命令,就象DOS里的https://www.doczj.com/doc/a94539251.html,所做的一样,所不同的是,在DOS中,https://www.doczj.com/doc/a94539251.html,只有一个,而在Linux下比较流行的shell有好几个,每个shell都各有千秋。一般的Linux系统都将bash作为默认的shell。 二、几种流行的shell 目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell类型: #echo $SHELL $SHELL是一个环境变量,它记录用户所使用的shell类型。你可以用命令: #shell-name 来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell。使用命令: $exit 可以退出这个子shell。 使用不同的shell的原因在于它们各自都有自己的特点,下面作一个简单的介绍: 1.ash ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。 2.bash bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的shell是因为它有诸如以下的特色: (1)可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。 (2)自动通过查找匹配的方式给出以某字符串开头的命令。 (3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。 3.ksh ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。 4.csh

linux+shell脚本语言基础知识

linux shell脚本语言基础知识 一.shell简介 Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的界面,更确切的说,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。 shell是一个命令解释器,它从输入设备读取命令,再将其转为计算机可以了解的指令,然后执行它。在linux中,shell又不仅是简单的命令解释器,而且是一个全功能的编程环境。 Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell (/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。通常用Bash,也就是Bourne Again Shell进行编程。 二.shell使用 1.建立和运行shell程序 shell脚本程序:按照一定的语法结构把若干linux命令组织在一起,是这些命令按照我们的要求完成一定的功能。它可以进行类似程序的编写,并且不需要编译就能执行。(只需修改其权限) 像编写高级语言的程序一样,编写shell程序需要一个文本编辑器,如VI和VIM,通常使用VIM文本编辑器,支持更便利的插入模式。 首先使用VIM编辑器编辑一个hello.sh文件: #!/bin/bash #hello world example

linux shell编程实验

Linux编程课程设计报告题目: Linux Shell编程 专业网络工程 学号姓名 指导教师 日期

题目:Linux Shell编程 一、设计目的和任务 实验目的:1.熟悉Shell环境和Shell的执行 2.熟悉Shell的基本语法和语句 3.了解Shell程序的调试方法 实验内容:1.编写Shell程序 2.调试和执行Shell程序 二、设计原理 Linux是一种开放源码、能够免费使用及自由传播的类似于UNIX操作系统。它可运行于各种平台之上。因为它不但具有UNIX系统的良好性能(如稳定性、安全性),同由于其具有开源和免费的特点,也越来越广泛地应用于各种嵌入式系统中。 Shell是用户和Linux操作系统内核程序间的一个借口。Shell既是命令解释器,有事一种编程语言。作为命令解释器,Shell为用户使用Linux 操作系统提供丰富的工具界面。若用户输入命令,Shell负责解释执行该命令并向用户返回结果。作为编程语言,它利用自身的语言结构将工具命令组合起来提供更复杂的功能。 三、实验环境和总体设计 1.PC一台 2.安装虚拟机版的Linux操作系统 四、详细设计步骤 1.打开vmware软件,启动Linux系统 2.用root用户名和密码登入系统中 3.将某目录下面所有的文件名后面加上所有者的名字,如a.txt的所有者为owner,修改后为a[owner].txt文件。 基本要求: ①使用方法为usage:程序名称目录名称 若没有“目录名称”参数,则修改当前目录下文件名称 ②对目录中的子目录不做变化。 ③ 给出实验结果。 五、结果测试与分析

六、存在的问题 Linux 系统的shell 作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。Shell 是一个命令语言解

Shell脚本编程详解-吐血共享

第12章 Shell 脚本编程 ● Shell 命令行的运行 ● 编写、修改权限和执行Shell 程序的步骤 ● 在Shell 程序中使用参数和变量 ● 表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序 12-1 Shell 命令行书写规则 ◆ Shell 命令行的书写规则 对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “ this is \ >long command ” This is long command 注意: “>”符号是自动产生的,而不是输入的。 12-2 编写/修改权限及执行Shell 程序的步骤 ◆ 编写Shell 程序 ◆ 执行Shell 程序 Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。

12-2-1 编辑Shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #! /bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day !” 注意: #! /bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date 命令前加符号“&”,其中%B%d%A为输入格式控制符。 12-2-2 建立可执行程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行程序权限。使用如下命令。[root@localhost bin]#chmod +x date 12-2-3 执行Shell程序 执行Shell程序有下面三种方法: 方法一: [root@localhost bin]#./ date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法二: 另一种执行date的方法就是把它作为一个参数传递给Shell命令: [root@localhost bin]# Bash date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法三: 为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。 具体操作如下: [root@localhost root]#export PATH=/bin:$PATH [root@localhost bin]# date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day !

linux-shell 脚本编写实验报告

实验报告 课程Linux基础及应用实验名称Linux Shell脚本编写第页 专业_计算机科学与技术__ 班级__6班_ 学号_105082009014_ 姓名林清萍 实验日期:2011年11 月3 日报告退发(订正、重做) 一、实验目的 1、掌握shell脚本编写的基本知识; 2、掌握shell脚本中变量的使用; 3、掌握shell脚本中引用命令行参数的方法; 4、掌握for循环、while循环、read命令的使用; 5、掌握命令扩展功能的使用。 二、实验内容 1、使用bash的for循环语句编写一脚本batchmkdir.sh,能实现以下功能:在当前目录中建立10个目录,目录的命名形式为dir-1、dir- 2、dir- 3、…..dir-10; 2、编写一个脚本batchuser.sh,能批量建立10个用户帐号,并给用户帐号设定8位的随机密码,同时把该用户名与密码保存到指定的文件中/root/user-pass.txt,以便管理员分发密码;其中帐号的形式为user-1、user-2、…user-10;保存用户名与密码的文件的每行的格式形式为:user-1:ChczVZww 提示:密码可以是命令"openssl rand -base64 7",把用户名与密码对保存到文件中可以使用输出重定向的方法:参考命令 echo “user-1: ChczVZww”>/root/user-pass.txt 3、在/root目录下编写脚本batchadduser.sh,实现以下功能:当用户以 ./ batchadduser stu 10 的方式运行脚本时,能自动添加stu1、stu2、stu3 …. stu10的10个帐号,设定8位的随机密码,并设置帐号的密码有效期为60天,下次登陆必须改密码。同时把该用户名与密码保存到指定的文件中/root/batch-user-pass.txt,密码文件的格式同第二题的要求。 4、编写一个shell脚本,实现以下功能:该脚本能读取usernamelist.txt中的用户列表(一行一个用户名)建立帐号,并给每个帐号设置8位随机密码,同时把该用户名与密码保存到指定userpass.txt 文件中,密码文件的格式同第二题的要求。 补充: usernamelist.txt用户列表该文件格式如下:(说明,每行一个用户名,) jack jason fried zike jicne ien

LINUX-Shell编程实验报告

《LINUX管理与应用》课程实验报告 ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

一、实验过程 1. 编写一个简单的回显用户名的shell程序 2. 使用if-then语句创建简单的shell程序 3. 使用if-then-else语句创建一个根据输入的分数判断是否及格的shell程序 4. 使用for语句创建简单的shell程序 5. 使用while语句创建一个计算1-5的平方的shell程序 6. 用shell设计一个模拟考勤程序 二、实验结果 1.编写一个简单的回显用户名的shell程序 #vi dat #!/bin/bash # echo "Mr.$USER,Today is:" echo `date` echo Wish you a lucky day! #chmod +x dat #./dat 2. 使用if-then语句创建简单的shell程序 #vi bbbb #!/bin/bash # echo -n "Do you want to continue: Y or N" read ANSWER if [ $ANSWER = N -o $ANSWER = n ] then echo "your answer is quit!" fi

#chmod +x bbbb #./bbbb 3. 使用if-then-else语句创建一个根据输入的分数判断是否及格的shell程序 #vi ak #!/bin/bash # echo -n "please input a score:" read SCORE echo "You input Score is $SCORE" if [ $SCORE -ge 60 ]; then echo -n "Congratulation!You Pass the examination." else echo -n "Sorry!You Fail the examination!" fi echo -n "press any key to continue!" read $GOOUT #chmod +x ak #./ak 4. 使用for语句创建简单的shell程序 #vi mm #!/bin/bash # for ab in 1 2 3 4 do echo $ab

shell脚本练习题

shell脚本例子集锦(习题总结) 练习一:写一个脚本 1.设定变量FILE的值为/etc/passwd 2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么 形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`) Hello,root,your UID is 0. 3.统计一个有多少个用户 答案一:#!/bin/bash file="/etc/passwd" LINES=`wc -l $file | cut -d" " -f1` for I in `seq 1 $LINES`;do userid=`head -$I $file | tail -1 |cut -d: -f3` username=`head -$I $file | tail -1 |cut -d: -f1` echo "hello $username,your UID is $userid" done echo "there are $LINES users" 答案二:#!/bin/bash file=/etc/passwd let num=0 for I in `cat $file`;do username=`echo "$I" | cut -d: -f1` userid=`echo "$I" | cut -d: -f3` echo "Hello,$username,your UID is $userid" num=$[$num+1] done echo "there are $num users" 练习二:写一个脚本 1.切换工作目录至/var 2.依次向/var目录中的每个文件或子目录问好,形如: (提示:for FILE in /var/*;或for FILE in `ls /var`;) Hello,log 3.统计/var目录下共有多个文件,并显示出来 答案:#!/bin/bash cd /var let num=0 for I in `ls /var/*`;do echo "hello $I" num=$[$num+1] done echo "the number of files is $num" 练习三:写一个脚本 1.设定变量file的值为/etc/passwd

LinuxShell脚本编程实例

#! /bin/sh echo "Current command is $0" echo "The first parameter is $1" echo "The second parameter is $2" echo "The third parameter is $3" echo "Total of parameters if $#" echo "Current PID is $$" #!/bin/bash times=0 until [ "$times" = 3 ]; do echo "I love linux." sleep 2 times=`expr $times + 1` done #!/bin/bash # menu shell script. samli 2004.4.19 until echo "List Directory..........1" echo "Change Directory........2" echo "Edit File...............3" echo "Remove File.............4" echo "Exit Menu...............5" read choice test $choice = 5 do case $choice in 1) ls;; 2) echo "enter target directory:" read dir cd $dir ;; 3) echo "enter file name:" read file vi $file ;; 4) echo "enter file name:" read file rm $file ;; 5) echo "Goodbye"

实验十三 shell脚本练习

上机实验内容: 1、请编写一个脚本,其功能是将当前用户的根目录下的work目录打包为名为“user’s-workdir-in-YYMMDD”的tar包(提示:参考用date建立文件) 要求:i)若该目录不存在,显示“dir not exist” ii)若该文件不是目录类型,显示“work is a type”,此处的type为文件类型 #!/bin/bash [ -e /work ] && tar -cvf "User's-workdir-in-`date +%Y%m%d`.tar" /work || echo "dir not exist" declare filetype="" [ -f /work ] && filetype="常规文件" [ -d /work ] && filetype="目录文件" [ -b /work ] && filetype="块设备文件" [ -c /work ] && filetype="字符设备" [ -S /work ] && filetype="套接字文件" [ -p /work ] && filetype="FIFO(管道)文件" [ -L /work ] && filetype="连接文件" [ "$filetype" != "" ] && echo "work is a $filetype" 2、编写一个脚本,其中包含一个打印函数,用于将多次输入的字符组合为一个字符串 要求:i)使用函数实现新值的输出 ii)使用循环语句完成多个字符的输入,直到输入字符串EOF才完成字符串的累加#!/bin/bash function add(){ str="$str"$input echo $str } read -p "请输入一个字符串或者输入EOF结束本次操作:" input declare str while [ "$input" != "EOF" ] do add read -p "请输入一个字符串或者输入EOF结束本次操作" input done 3、自我练习:设计一个运算器,实现“加、减、乘、除”功能。 (四则运算:符号使用+、-、*、/) #!/bin/bash

Linux编写shell脚本if for while

Linux编写shell脚本if for while 使用if条件语句 If语句好处:可以根据特定条件来决定是否执行某项操作,当满足不同条件时执行不同操作, 相关条测试操作 Test 条件表达式 [ 条件表达式] [ ] 方括号与条件表达式需要用空格进行分隔 1.测试文件状态 -d 是否为目录 -e 文件是否存在 -f 是否为文件 -r 是否有读取的权限 -w 是否有写入权限 -x 是否有执行权限 -L 是否为链接文件 2. 整数值比较 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -le 小于等于 -ge 大于等于 3. 字符串比较 = 匹配 != 不匹配 -z是否为空 !用于取反 4逻辑测试 &&逻辑与(前后两个条件都为真时,结果才为真)

||逻辑或(有一个条件成立,结果即为真)!逻辑非(指定条件不成立,结果为真)if语句的结构 1.单分支的if语句 if条件测试命令 then 命令序列 fi 条件成立 执行then后一条或多条命令(命令序列)直到fi 表示结束 条件不成立 直接执行fi 条件成立 执行then后的一条或多条命令(命令序列)条件不成立 执行else后的一条或多条命令 直到fi 2.双分支的if语句 if 条件测试命令 then 命令序列1 else 命令序列2 fi 条件成立 执行then后的一条或多条命令(命令序列)

条件不成立 执行else后的一条或多条命令 直到fi 3.多分支的if语句(更多使用case语句来实现) 根据if语句条件测试命令的两种状态分别进行操作,嵌套使用, 条件1为真:执行then后的命令直到fi 条件1为假:执行elif后的条件2 条件2为真,执行命令2,直到fi 为假,执行else后的命令3直到fi if 条件测试命令1 then 命令序列1 elif 命令测试条件2 then 命令序列2 else 命令序列3 fi 根据if语句条件测试命令的两种状态分别进行操作,嵌套使用, 条件1为真:执行then后的命令直到fi 条件1为假:执行elif后的条件2 条件2为真,执行命令2,直到fi 为假,执行else后的命令3直到fi 将case后边的变量只与模式1、模式2 ………..等进行逐一比较,直到找到与之匹配的值,然后执行该模式下的命令序列,当遇到;;后跳转至esac后结束分支

shell脚本之前的基础知识

第十二章学习shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力来衡量这个linux系统管理员的经验是否丰富。笔者讲这些的目的只有一个,那就是让你认真对待shell脚本,从一开始就要把基础知识掌握牢固,然后要不断的练习,只要你shell脚本写的好,相信你的linux求职路就会轻松的多。笔者在这一章中并不会多么详细的介绍shell脚本,而只是带你进入shell脚本的世界,如果你很感兴趣那么请到网上下载相关的资料或者到书店购买相关书籍吧。 在学习shell 脚本之前,需要你了解很多关于shell的知识,这些知识是编写shell脚本的基础,所以希望你能够熟练的掌握。 【什么是shell】 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。 笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢? 1)记录命令历史 我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。 与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个应用:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3)!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令。

LinuxShell脚本编程实例

1、打印位置变量的个数和位置变量的内容 #! /bin/sh echo "Current command is $0" echo "The first parameter is $1" echo "The second parameter is $2" echo "The third parameter is $3" echo "Total of parameters if $#" echo "Current PID is $$" 2、循环打印“I love linux”3次 #!/bin/bash times=0 until [ "$times" = 3 ]; do echo "I love linux." sleep 2 times=`expr $times + 1` done 3、完成菜单程序的功能: 1)列出当前的文件 2)更改路径 3)编辑文件 4)删除文件 #!/bin/bash # menu shell script. until echo "List Directory..........1" echo "Change Directory........2" echo "Edit File...............3" echo "Remove File.............4" echo "Exit Menu...............5" read choice test $choice = 5 do case $choice in 1) ls;; 2) echo "enter target directory:" read dir cd $dir ;; 3) echo "enter file name:" read file vi $file

linux Shell(脚本)编程入门 实例讲解详解

linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash 的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

Linux-Shell编程从入门到精通学习教程打包下载==

Linux-Shell编程从入门到精通学习教程打包下载==

Linux Shell编程从入门到精通学习教程打包下载 课程目标 我们可以通过本次系列的编程技术学习,掌握企业里面的运维编程必备脚本,同时掌握企业运维到底要求会什么东西,有哪些是我们必须要掌握的知识。适用人群 适合有linux基础知识,想进一步学好linux的各位同学,我也会跟大家一起努力,分享、感恩、成长! 课程简介 【Linux编程视频课程Shell从入门到精通(完整版)】 课程目标: 本套课程适用于初学者以及各类运维人员,我们可以通过本次系列的编程技术学习,掌握企业里面的运维编程必备脚本,同时掌握企业运维到底要求会什么东西,有哪些是我们必须要掌握的知识,为我们的运维能力保驾护航、增值加薪,让我们的运维更加容易,真正做到懒人运维,而不是每天苦逼的搬服务器,每天无奈的去救火! 适合对象: 适合有linux基础知识,想进一步学好linux的各位同学,我也会跟大家一起努力,分享、感恩、成长! 学习条件: 需要有耐心、对自己负责,对自己的人生负责,选择了决定未来,选择了就全力以赴去行动,相信结果值得拥有! 学习宣言:

让我们乘着Linux的大船,奔向我们未来的方向!期待以及祝愿同学们每个人都有好的收获,每天都有新的起点!人人都能学会我们的linux下Shell 编程。 课程 1 Linux下Shell编程基础入门 [免费观看] 14分钟 说到Shell编程,我想很多从事Linux运维工作的朋友都不陌生,都对Shell 有基本的了解,可能大家刚开始接触Shell的时候,有各种想法?能不能不学?高大上?到底是浮云?还是神马?很难啊?我想告诉大家的是,大家有这些想法一点都不觉得惊讶,为什么?这些都很正常,对于任何一件事情在未开始之前,肯定会有总总假设,那我今天想说的是,学完人人都会Shell 编程后,我们会觉得一切的Shell都是浮云,我们每个人都能很好的使用它,驾驭它,更好的完成我们日常运维的工作。曾经有人说过,玩Linux不知道Shell,那就是不懂Linux;现在细细品味确实是这样。为了让更多的人能接触Shell、了解Shell,使用Shell,所以今天开设了这样一个网络课程,让我们的Shell飞起来。 2 Shell编程之变量及LAMP导航菜单编写 [免费观看]

Shell编程基础.pdf

为什么要进行shell编程 Linux系统中虽然有各种各样的图形界面工具,但shell仍然是一个非常灵活的工具。Shell不仅集合了大量命令,还是一门非常棒的编程语言。借助shell,大量任务能实现自动化;shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有许多种不同的shell,通常我们使用bash (bourne again shell) 进行shell编程因为bash不仅免费(自由)且易于使用。本文提供的脚本都用bash(当然大多数情况下,这些脚本同样可以在bash的前辈, bourne shell中运行)执行。 如同其他语言一样,我们可以使用任意一种文字编辑器,比如nedit、kedit、emacs、vi 等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): 代码: #!/bin/bash 符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑完了,如果要执行该脚本,还必须使其可执行: 代码: chmod +x filename 这样输入 ./filename 便可执行该脚本。 注释 shell脚本中以# 开始的行表示注释,直到一行的结束。我们真诚的建议你在脚本中使用注释,这样即便在相当长时间内没有使用该脚本,你也能在短时间内明白该脚本的作用和工作原理;此外还有很重要的原因——有了注释,更利于和别人分享你的脚本。 变量 在其它编程语言中,你必须使用变量。shell编程中,所有变量都由字符串组成,并且不需要声明。要给一个变量赋值,你可以这么写: 代码: 变量名=值

LINUX课程设计shell编程(2)

LINUX课程设计shell编程(2)

《Linux操作系统》 课程设计说明书 题目:Shell编程—用户信息管理 专业: 班级: 学号: 姓名: 指导老师: 06月08日 一.课程设计目的 《Linux操作系统》课程设计是网络工程专业的集中实践性环节之一,是学习完《linux操作系统》课程后进行的一次全面的

综合练习。其目的在于加深对linux操作系统的系统管理各方面技术的掌握,使学生更好地把握linux操作系统的基础命令、shell脚本技术以及各种基础服务器的配置和基本应用。类UNIX操作系统在网络环境及手持设备环境下使用极为流行,几乎所有的网络服务器都是运行在类UNIX系统之上;基于类UNIX裁剪版本的手持设备也在市场中占有极大的比重,因此,对于网络工程专业掌握类UNIX操作系统的基本使用方法是相当重要的。而Linux就是类UNIX中最为流行的一个分支,鉴于Linux的开源和Linux开发群的活跃特性,Linux都是高等院校计算机类专业必开设的课程。而Linux操作系统课程设计能够更好的加强学生在课程学习中各种知识的综合应用能力和实践经验。 二.课程设计内容 在主Shell脚本文件里(必须以menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 1)在屏幕上显示当前所有用户的记录 2)在屏幕上显示当前所有用户(经过格式化和排序的)的记录 3)只在屏幕上显示用户名和用户ID 4)只在屏幕上显示(经过格式化和排序的)用户名和用户ID 5)查询并显示特定用户的记录 6)往passwd文件里增加新的用户记录

Linux 脚本编写基础

Linux 脚本编写基础 1.Linux脚本编写基础 1.1语法基本介绍 1.1.1开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 编译chmod+x filename这样才能用./filename来运行 1.1.2注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。 如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用 及工作原理。 1.1.3变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量

进行声明。要赋值给一个变量,您可以这样写: #!/bin/sh #对变量赋值: a="hello world" #现在打印变量a的内容: echo"A is:" echo$a 有时候变量名很容易与其他文字混淆,比如: num=2 echo"this is the$numnd" 这并不会打印出"this is the 2nd",而仅仅打印"this is the",因为 shell会去搜索变量numnd的值, 但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量: num=2 echo"this is the${num}nd" 这将打印:this is the 2nd 1.1.4环境变量 由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录 脚本中使用环境变量。 1.1.5 Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix命令:

Shell编程基础教程

1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须放在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行: chmod +x filename 这样才能用./filename 来运行 1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 1.1.3 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写: #!/bin/sh #对变量赋值: a="hello world" # 现在打印变量a的内容: echo "A is:" echo $a 有时候变量名很容易与其他文字混淆,比如: num=2 echo "this is the $numnd" 这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量: num=2 echo "this is the ${num}nd"

这将打印: this is the 2nd 1.1.4 环境变量 由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。 1.1.5 Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: s虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。 常用命令语法及功能: echo "some text": 将文字内容打印在屏幕上 ls: 文件列表 wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数 cp sourcefile destfile: 文件拷贝 mv oldname newname : 重命名文件或移动文件 rm file: 删除文件 grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令 cat file.txt: 输出文件内容到标准输出设备(屏幕)上 file somefile: 得到文件类型 read var: 提示用户输入,并将输入赋值给变量 sort file.txt: 对file.txt文件中的行进行排序 uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3 find: 搜索文件比如:根据文件名搜索find . -name filename -print tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

相关主题
文本预览
相关文档 最新文档