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

shell脚本基础

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

一、编制shell脚本

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

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.重定向操作

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

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

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

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

重定向的类型分为:

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:当前执行的进程/程序名

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

linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量相关推荐

  1. linux shell 宏定义_一篇教会你写90%的shell脚本

    shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls.cd.pwd等等.总结来说,Shell是一个命令解释器,它通过接 ...

  2. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter6-Linux 环境变量

    六.Linux 环境变量 bash shell 使用环境变量来存储 shell 会话和工作环境的相关信息(这也是被称作环境变量的原因).环境变量允许在内存中存储数据, 以便 shell 中运行的程序或 ...

  3. shell的相关知识(变量、脚本定义)

    一.shell的相关知识: 1.对于shell编程语言大体分为:机器语言.汇编语言.高级语言 2.shell变量类型:事先确定数据的存储格式和长度 shell变量分为:字符型.数值型 数值型又分为:整 ...

  4. linux文件的定义变量的值,linux shell 自定义函数方法(定义、返回值、变量作用域)...

    一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带functi ...

  5. linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本

    前言: shell脚本的功能十分强大,这一点毋庸置疑的.那么,平常的工作中总是免不了和脚本打交道,也免不了要自己编写一些脚本. 每个人都希望自己编写的脚本强壮,简单,易用,功能多,并且总是希望脚本运行 ...

  6. Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

  7. Linux Shell脚本入门教程系列之(十五) Shell函数简介

    本文是Linux Shell脚本系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 上一篇之后,函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰 ...

  8. Linux Shell脚本入门教程系列之(十四) Shell Select教程

    本文是Linux Shell脚本系列教程的第(十四)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上一篇文章:Linux Shell系列教程之(十三)Shell分支语句 ...

  9. Linux Shell脚本入门教程系列之(十二)Shell until循环

    本文是Linux Shell脚本系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环 ...

最新文章

  1. 疫情之下,MWC 2020正式取消!此前仍有中国公司表态坚持参展
  2. 对Web页面元素的绝对唯一引用方法
  3. 5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出
  4. html5的api有什么区别,HTML入门--浅谈HTML和HTML5有什么区别?
  5. 检测1的个数_冲床电永磁夹紧系统(PMCS),实现1分钟的快速换模~
  6. asp.net 分布式应用开发
  7. iPhone程序运行流程浅谈
  8. c# lock的使用及注意事项
  9. 【C++笔记】构造函数与析构函数相关知识
  10. Keil3/4/5 For C51安装教程(附Baidu 云链接)
  11. python各种库下载地址:
  12. 零基础如何入门MATLAB(适用于所有编程语言)?(建议收藏)
  13. Java类和对象 详解(一)
  14. 2.3 连续性随机变量
  15. 不用PS,小白也能轻松搞定抠图
  16. 计算机中桌面位置更改,电脑默认桌面文件夹位置修改不了怎么办
  17. pycharm 中 pydev debugger: CRITICAL WARNING: This version of python seems to be incorrectly compiled
  18. linux序列拼接软件,EST序列的聚类、拼接以及纠错是怎样进行的,推荐使用那些软件?!...
  19. 华为校园招聘技术类笔试面试经验(摘)
  20. 用java实现评委打分系统程序

热门文章

  1. JS Location
  2. 【Docker】常用命令简述十一
  3. 服务器端配置nodejs环境(使用pm2进程管理运行)
  4. Java序列化技术即将被废除!!!
  5. TCP的电话系统比喻
  6. android中倒计时控件CountDownTimer分析
  7. 如何使用C#操作WinAPI
  8. Android开发遇到的异常及解决办法
  9. Windows Workflow Foundation 4.0
  10. 选择器高级、样式及布局