linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量
随着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变量相关推荐
- linux shell 宏定义_一篇教会你写90%的shell脚本
shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls.cd.pwd等等.总结来说,Shell是一个命令解释器,它通过接 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter6-Linux 环境变量
六.Linux 环境变量 bash shell 使用环境变量来存储 shell 会话和工作环境的相关信息(这也是被称作环境变量的原因).环境变量允许在内存中存储数据, 以便 shell 中运行的程序或 ...
- shell的相关知识(变量、脚本定义)
一.shell的相关知识: 1.对于shell编程语言大体分为:机器语言.汇编语言.高级语言 2.shell变量类型:事先确定数据的存储格式和长度 shell变量分为:字符型.数值型 数值型又分为:整 ...
- linux文件的定义变量的值,linux shell 自定义函数方法(定义、返回值、变量作用域)...
一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带functi ...
- linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
前言: shell脚本的功能十分强大,这一点毋庸置疑的.那么,平常的工作中总是免不了和脚本打交道,也免不了要自己编写一些脚本. 每个人都希望自己编写的脚本强壮,简单,易用,功能多,并且总是希望脚本运行 ...
- Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向
本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...
- Linux Shell脚本入门教程系列之(十五) Shell函数简介
本文是Linux Shell脚本系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 上一篇之后,函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰 ...
- Linux Shell脚本入门教程系列之(十四) Shell Select教程
本文是Linux Shell脚本系列教程的第(十四)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上一篇文章:Linux Shell系列教程之(十三)Shell分支语句 ...
- Linux Shell脚本入门教程系列之(十二)Shell until循环
本文是Linux Shell脚本系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环 ...
最新文章
- 疫情之下,MWC 2020正式取消!此前仍有中国公司表态坚持参展
- 对Web页面元素的绝对唯一引用方法
- 5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出
- html5的api有什么区别,HTML入门--浅谈HTML和HTML5有什么区别?
- 检测1的个数_冲床电永磁夹紧系统(PMCS),实现1分钟的快速换模~
- asp.net 分布式应用开发
- iPhone程序运行流程浅谈
- c# lock的使用及注意事项
- 【C++笔记】构造函数与析构函数相关知识
- Keil3/4/5 For C51安装教程(附Baidu 云链接)
- python各种库下载地址:
- 零基础如何入门MATLAB(适用于所有编程语言)?(建议收藏)
- Java类和对象 详解(一)
- 2.3 连续性随机变量
- 不用PS,小白也能轻松搞定抠图
- 计算机中桌面位置更改,电脑默认桌面文件夹位置修改不了怎么办
- pycharm 中 pydev debugger: CRITICAL WARNING: This version of python seems to be incorrectly compiled
- linux序列拼接软件,EST序列的聚类、拼接以及纠错是怎样进行的,推荐使用那些软件?!...
- 华为校园招聘技术类笔试面试经验(摘)
- 用java实现评委打分系统程序