热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux脚本基础,Shell脚本基础

随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,

随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。作为Linux系统运维工程师,必须得要掌握Shell脚本的基本知识和编写及使用。

shell脚本基础

在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容易出错,而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一些列维护任务,大大减轻管理员的负担。

如果使用的较老版本的Shell,建议将其更新至最新版本,因为老版的Shell出现了非常严重的错误。检测系统Shell是否存在漏洞,使用以下命令:

[root@localhost ~]# env x='() { :;}; echo be careful' bash -c "echo this is ok"

this is ok //这种情况表示没有问题

be careful //这种情况就需要更新

更新方法如下:

[root@localhost ~]# yum -y update bash

学习测试环境,使用较老版本的Shell也没有问题,但是生产环境中,必须更新Shell!!!

这个问题解决之后,下面开始介绍Shell

一、编制shell脚本

Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“翻译官”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。如图:

9e3e46c9afecdc9ded2966d4102fd5a4.png

Linux系统中常见的shell解释程序有很多种,使用不同的shell脚本时,其内部指令、命令提示灯方面会存在一些区别。

[root@localhost ~]# cat /etc/shells //查看当前系统支持哪些shell

* /bin/sh

* /bin/bash

* /sbin/nologin

* /usr/bin/sh

* /usr/bin/bash

* /usr/sbin/nologin

* /bin/tcsh

* /bin/csh

[root@localhost ~]# /bin/sh //切换shell

sh-4.2# exit //返回上一层shell

[root@localhost ~]#

/bin/bash是目前大多数Linux版本采用的默认shell脚本。

shell脚本:简单来说就是把在命令行执行的命令按顺序存放在一个文本文件中,赋予其可执行权限。那么这个文本文件就可称为一个脚本。比如:

[root@localhost ~]# cd /

[root@localhost /]# pwd

/ //这是两条命命输出的结果

[root@localhost ~]# vim a.sh //编写为本文件,以“.sh”结尾只是为了让别人知道这是一个脚本。

cd /

pwd

[root@localhost ~]# chmod +x a.sh //服务文本文件可执行的权限

[root@localhost ~]# ./a.sh

/ //查看脚本的执行结果和命令行执行的结果是一样

执行脚本的方法:

“./”:(相对或绝对路径)这种方法脚本必须得需要可执行权;

sh:通过/bin/sh来解释脚本;

source或“.”:内部命令来加载脚本中的内容。

前两种方法是在子shell中执行;第三种方法是在当前shell中执行!

二、重定向与管道操作

由于shell脚本的“批量处理”的特殊性,其大部分操作过程以静默的方式运行,不需要用户干预。因此学会提取、过滤执行信息变得十分重要。

1.重定向操作

用户通过操作系统处理信息的过程中,包括三类交互设备文件:

6c12105f9491df5ec34f1deb76ef0eab.png

标准输入:从该设备接收用户输入的数据;

标准输出:通过该设备向用户输出数据;

标准错误:通过该设备报告执行出错信息。

重定向的类型分为:

086cc3267be41736406fe35a464add3e.png

2.管道操作

管道符的作用就是将左侧的命令输出结果,作为右侧命令的处理对象。比如:

[root@localhost ~]# df -hT | grep "/$" | awk '{print $6}'

26%

//提取根分区(/)的磁盘使用率信息

三、shell变量

各种Shell环境中都使用到了“变量”的概念。Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过适当地使用变量,Shell程序能够提供更加灵活的功能,适应性更强。

Linux系统下常见的四种变量:

1.自定义变量

自定义变量是由系统用户自己定义的变量吗,只在用户自己的Shell环境中有效,因此,也有人称为本地变量。在编写Shell脚本程序是,用户通常会设定一些特定的自定义变量,以适应程序执行过程中各种变化,以满足不同的需求。

1)定义新的变量

定义变量的基本格式“变量名=变量值”,等号两边不允许有空格。变量名称需要以字母或下划线开头,名称中不要包含特殊字符(比如:+、-、*、/、……?、&、%等)。比如:

[root@localhost ~]# product=php

[root@localhost ~]# version=7.3.1

2)查看和引用变量

通常在变量名称前添加前导符“$”,可以引用一个变量的值。比如:

[root@localhost ~]# echo $product

php

[root@localhost ~]# echo $product $version

php 7.3.1

当变量名称容易和紧跟其后的其他字符相互混淆时,需要使用“{}”将变量括起来,否则将报错。比如:

[root@localhost ~]# echo $product1234 //没有找到“product1234”这个变量

[root@localhost ~]# echo ${product}1234 //正确输出变量和字符

php1234

3)变量赋值的特殊操作

1.双引号(" "):双引号主要起界定字符串的作用,特别是当要复制的内容中包含空格是,必须以双引号括起来,其他情况双引号可以省略。比如:

[root@localhost ~]# Python=python 2.3.7

bash: 2.3.7: 未找到命令...

[root@localhost ~]# python="python 2.3.7"

[root@localhost ~]# echo $python

python 2.3.7

双引号还允许通过$符号引用其他变量值,比如:

[root@localhost ~]# SQL="SQLServer $version"

[root@localhost ~]# echo $SQL

SQLServer 1.2.3

2.单引号(' '):禁止引用其他变量值,$视为普通字符,单引号中的特殊符号都将视为普通字符,比如:

[root@localhost ~]# SQLServer='SQLserver $version'

[root@localhost ~]# echo $SQLServer

SQLserver $version

3.反撇号():主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的内容必须是可以执行的命令,否则将出错。比如:

[root@localhost ~]# ls -lh `which systemctl`

-rwxr-xr-x. 1 root root 623K 11月 7 2016 /usr/bin/systemctl

注意:使用反撇号难以子啊一行命令中实现嵌套命令替换操作,这时可以使用“$()”来替代反撇号操作,解决嵌套问题。比如:

[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))

/etc/default/useradd

/etc/login.defs

//查询提供useradd命令程序的软件包所安装的配置文件位置

4.大括号({}):用来分割变量和字符;如果在变量后还有其他字符,就需要使用“{}”,{}中是变量。

4)read命令

read命令可以使从键盘输入的内容为变量赋值,比如:

[root@localhost ~]# read abc

/opt/backup //输入给变量abc所赋的值

[root@localhost ~]# echo $abc

/opt/backup //查看结果

为了使交互式操作的界面更加友好,提高易用性,read命令可以加“-p”选项来设置提示信息,以便告知用户应该输入什么内容等。比如:

[root@localhost ~]# read -p "请指定存放的目录:" abcd

请指定存放的目录:/opt/backup

[root@localhost ~]# echo $abcd

/opt/backup

5)设置变量的作用范围

默认情况下,新定义的变量只能在当前Shell环境中有效,因此称为局部变量;当进入子程序或者新的Shell时,局部变量将不能使用。比如:

[root@localhost ~]# echo "$SQL $version"

SQLServer 1.2.3 1.2.3

[root@localhost ~]# /bin/sh //切换一个Shell环境

sh-4.2# echo "$SQL $version" //找不到这样的变量

sh-4.2# exit //返回上一个Shell

[root@localhost ~]#

为了使用户定义的变量可以在所有Shell环境中继续使用,减少重复的工作,可以通过内部命令export将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无需使用“$”符),变量之间用空格分割即可!

[root@localhost ~]# export SQL version

[root@localhost ~]# /bin/sh

sh-4.2# echo "$SQL $version"

SQLServer 1.2.3 1.2.3

//测试成功

6)数值变量的运算

在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。数值运算主要是通过内部命令expr进行。

常用的变量:

加法运算:+

减法运算: -

乘法运算: *

除法运算: /

求模(取余)运算: %

比如:

[root@localhost ~]# x=35

[root@localhost ~]# y=16

[root@localhost ~]# expr $x + $y

51

[root@localhost ~]# expr $x - $y

19

[root@localhost ~]# expr $x \* $y

560

[root@localhost ~]# expr $x / $y

2 //只取整数

[root@localhost ~]# expr $x % $y

3

2.环境变量

环境变量指的处于运行需要由Linux系统提前创建好的一类变量。环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。

使用env命令可以查看当前的所有环境变量,以便了解各个变量的用途!

在Linux系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用域所有用户。每个用户也有自己的环境变量配置文件(~/.bash_profile)。

3.位置变量

当执行命令行操作时,第一个字段表示命令字或脚本程序名,其余的字符串按照从左到右的顺序依次赋值给位置变量。

位置变量也称为位置参数,使用$1、$2…$8、$9表示。比如:

[root@localhost ~]# vim 123.sh

#!/bin/bash //声明使用何种Shell

SUM=`expr $1 + $2`

echo "$1 + $2=$SUM"

[root@localhost ~]# chmod +x 123.sh

[root@localhost ~]# ./123.sh 12 34 //$1为12、$2为34时

12 + 34=46

4.预定义变量

预定义变量是由Bash程序预先定义好的一类特殊变量,用户不可修改,预定义变量的格式:

$#:命令行中位置变量的个数

$*:所有位置变量的内容

$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

$0:当前执行的进程/程序名

建议写在脚本中的命令,应先在命令行,执行完成确认结果之后,再写入脚本中。第一次编写脚本,可能会麻烦一些,当脚本编写完成之后,以后再有类似的需求,直接运行脚本即可!



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 作者|JiekeXu来源|JiekeXu之路(ID:JiekeXu_IT)转载请联系授权|(微信ID:xxq1426321293)大家好,我是Jieke ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • nginx使用内置模块配置限速限流的方法实例_nginx
    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景,下面这篇文章主要给大家介绍了关于nginx使用内置模块配置限速限流的 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 弹性云服务器ECS弹性云服务器(ElasticCloudServer)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境 ... [详细]
author-avatar
冷瞳流行精品服装店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有