编写简单的Shell脚本

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

shell脚本基础

1. 编写第一个shell脚本

Linux中的shell脚本是一个特殊的应用程序,介于操作系统内核和用户之间,充当了一个命令解释器的角色,负责接收用户的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果

常见的shell解释器

可通过/etc/shells文件了解当前系统所支持的shell种类。而/bin/bash是大多数Linux默认的shell脚本

[[email protected] ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
……  //省略部分内容

编写脚本文件

将平时使用的各种Linux命令按顺序保存到一个文本文件,然后添加执行权限,这个文件就是一个shell脚本了

[[email protected] ~]# vim first.sh           //新建first.sh文件
#!/bin/bash                               //脚本声明                
# This is my first Shell-Script.          //注释信息
cd /boot                                  //可执行语句
pwd
ls -lh vml*
[[email protected] ~]# . first.sh              //以下四种方式可执行脚本
[[email protected] ~]# sh first.sh
[[email protected] ~]# source first.sh
[[email protected] ~]# chmod +x first.sh
[[email protected] ~]# ./first.sh              //这种方式需要文件有x权限,而上面三种不需要

2. 重定向与管道操作

(1)重定向操作

Linux系统使用文件来描述各种硬件、设备等资源。而用户通过操作系统处理信息的过程中,包括以下几类交互设备文件:

在实际Linux系统维护中,可以改变输出、输入内容的方向,不使用默认的标准输入、输出设备,这种操作称为重定向

(2)管道操作

管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,作为右侧命令的处理对象,同一个命令中可以有多个管道

[[email protected] ~]# grep “bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash

[[email protected] ~]# grep “bash$” /etc/passwd | awk  -F:  ‘{print $1,$7}’
root  /bin/bash
teacher  /bin/bash

使用shell变量

shell变量用来存放系统和用户需要使用的特定参数,而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过shell变量,shell程序能够提供更加灵活的功能,适应性更强

常见shell变量的类型包括自定义变量、环境变量、位置变量、预定义变量

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

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

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

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

1. 自定义变量

(1)定义新的变量

定义变量的基本格式为“变量名=变量值”,变量名以字母或下划线开头,区分大小写,建议全大写

(2)查看和引用变量的值

基本格式为:echo 
$变量名

[[email protected] ~]# xing=yang
[[email protected] ~]# ming=shufan
[[email protected] ~]# echo $xing
yang
[[email protected] ~]# echo $xing $ming
yang shufan
[[email protected] ~]# echo ${xing}shufan
yangshufan

(3)变量赋值的特殊操作

赋值时使用引号:

双引号("):当赋值内容中包含空格时,必须使用双引号,允许通过$符号引用其他变量值

单引号('):当赋值内容中包含特殊字符时,必须使用单引号

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

[[email protected] ~]# xingming="yang $ming"       //双引号的应用
[[email protected] ~]# echo $xingming
yang shufan
[[email protected] ~]# xingming='yang $ming'       //单引号的应用
[[email protected] ~]# echo $xingming
yang $ming
[[email protected] ~]# aaa=`grep “bash$" /etc/passwd`       //反撇号的应用
[[email protected] ~]# echo $aaa
root:x:0:0:root:/root:/bin/bash

除了上述情况可以赋值外,还可以使用read命令进行赋值

[[email protected] ~]# read xing
yang
[[email protected] ~]# echo $xing
yang

(4)设置变量的作用范围

默认情况下,新定义的变量只在当前shell环境中有效,称为局部变量,当进入子程序或新的子shell环境时,将无法使用。为了使用户自定义的变量在多有子shell环境中能继续使用,可以通过内部命令export将指定变量导出为“全局变量”,可同时指定多个变量名作为参数,变量名之间以逗号分隔

[[email protected] ~]# echo $xing $ming
yang shufan
[[email protected] ~]# export xing ming           //将xing、ming设为全局变量
[[email protected] ~]# bash                       //进入子shell环境
[[email protected] ~]# echo $xing $ming           //调用父shell的全局变量
yang shufan  
[[email protected] ~]# exit                       //返回原有的shell环境

[[email protected] ~]# export  xingming=yangshufan
[[email protected] ~]# echo $xingming           //新建一个名为xingming的全局变量
yangshufan

(5)数值变量的运算

在bash shell环境中,只能进行简单的整数运算,不支持小数运算,通过expr命令进行,格式如下:

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

    常用的几种运算符如下所示:

加法运算:+

减法运算:-

乘法运算:\*  不能仅使用*,否则将当成文件通配符

除法运算:/

求模(取余)运算:%  计算数值相除后的余数

[[email protected] ~]# x=35
[[email protected] ~]# y=16
[[email protected] ~]# expr $x + $y    //加
51
[[email protected] ~]# expr $x - $y    //减
19
[[email protected] ~]# expr $x \* $y    //乘
560
[[email protected] ~]# expr $x / $y     //除
2
[[email protected] ~]# expr $x % $y     //取余
3

[[email protected] ~]# abc=`expr $x + $y `     //将运算结果赋值给变量abc
[[email protected] ~]# echo $abc
51

2. 环境变量

环境变量由系统提前创建的一类变量,主要用户设置用户的工作环境,由Linux系统自动维护,会随着用户状态的改变而改变,可以使用env命令查看当前工作环境下的环境变量

PATH变量用于可执行程序的默认搜索路径

[[email protected] ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[[email protected] ~]# PATH="$PATH:/root" 
[[email protected] ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root

3. 位置变量

位置变量也称位置参数,使用$1、$2、$3、…、$9表示

[[email protected] ~]# vim xxx.sh
#!/bin/bash
sum='expr $1 + $2'
echo "$1 + $2 = $sum"

[[email protected] ~]# . xxx.sh  12  34
12 + 34 = 46
[[email protected] ~]# . xxx.sh  10  50
10 + 50 = 60

4. 预定义变量

预定义变量是由bash程序预先定义好的一类特殊的变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能为预定义变量赋值。使用$符号和另一个符号组合表示,下面是几个常用的预定义变量:

$#:表示命令行中位置参数的个数

$*:表示所有位置参数的内容

$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0表示执行异常

$0:表示当前执行的脚本或程序的名称

[[email protected] ~]# cat mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo “具体内容包括: $*” 
[[email protected] ~]# ./mybak.sh  /etc/passwd  /etc/shadow 
已执行 ./mybak.sh 脚本,
共完成 2 个对象的备份
具体内容包括:/etc/passwd /etc/shadow

shell脚本与任务计划

案例:某公司使用MySQL数据库,需要对MySQL服务器中的yang库进行远程备份,每天凌晨2:30执行,每个备份为独立的.sql文件,然后压缩为.tar.gz格式,文件名嵌入执行备份时的日期和时刻

配置步骤如下:

(1)创建一个专用的数据库备份账户ysf,允许从备份主机192.168.1.2连接到MySQL数据库,并授予对yang库的读取权限。使用备份工具mysqldump时,还需要对库设置select和lock tables权限

(2)从MySQL客户端中测试数据库访问、查询授权是否有效,或使用备份mysqldump工具进行测试

(3)在MySQL客户端编写MySQL备份脚本,并测试能够成功备份

(4)设置计划任务

时间: 2024-10-13 23:24:48

编写简单的Shell脚本的相关文章

编写简单的shell脚本 - for循环 - 解决报错 Syntax error: Bad for loop variable

为了编写批量导入数据的程序,故而学习编写shell脚本!现学现用! ============================================ 1.第一个简单的for循环 #!/bin/bashfor i in 1 2 3 4;do echo $i;done 2.测试for的自增长的循环: #!/bin/bashfor ((i=1; i<=5; i++))do echo $i;done 如果会报错,没有则跳过: Syntax error: Bad for loop variable

小鸟初学Shell编程(二)编写简单的Shell脚本

Shell脚本 编写Python.PHP脚本通常需要掌握语言的函数,那么Shell脚本则不需要,只需要掌握Linux命令就可以编写Shell脚本,因为Shell脚本就是由多个Linux命令组成,通过将多个Linux命令组合保存成一个脚本文件,可直接给其他人使用. 组合命令 进入一个目录,查看目录的文件,这个过程分别需要执行两条命令,分别是cd 和ls. 分开执行两个命令的形式如下: [[email protected] usr]# cd /usr/ [[email protected] usr]

一个简单的shell脚本

一个简单的shell脚本 编写 假设我想知道目前系统上有多少人登录,使用who命令可以告诉你现在系统有谁登录: 1.[[email protected] ~]$ who2.KANO tty1 2016-02-15 01:47 (:0)3.KANO pts/0 2016-02-15 01:48 (kelvin) 当然在个人电脑上,所列出来的列表可能只有上面这么短.但是在一些大型.多用户的系统上,所列出的列表就可能很长.这个时候我们可以使用自动计算用户总数.wc是一个字数计算程序,它可以计算出行数(

一些简单的shell脚本例子

         对于刚开始学shell脚本的人来说,建立编程思维很重要,需要能够把自己需要做的事情,用编程的方式表达出来,下面是我学习和搜集的一些例子,对于刚刚开始接触的人,或许有一定的帮助.      求任意数的和或乘积,先定义函数,任意数的和.乘积,然后通过case结构再定义变量,调用函数. hei(){ x=1 while [ $# -gt 0 ] do x=`expr $x \* $1` shift done echo $x } he(){ x=0 while [ $# -gt 0 ]

[一] 编写第一个 Shell 脚本

什么是 Shell 脚本? 最简单的解释,一个 shell 脚本就是一个包含一系列命令的文件.shell 读取这个文件,然后执行 文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样. Shell 有些独特,因为它不仅是一个功能强大的命令行接口,也是一个脚本语言解释器.我们将会看到, 大多数能够在命令行中完成的任务也能够用脚本来实现,同样地,大多数能用脚本实现的操作也能够 在命令行中完成. 虽然我们已经介绍了许多 shell 功能,但只是集中于那些经常直接在命令行中使用的功能. She

编写可靠Linux shell脚本的八个建议

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了. 1. 指定bash shell 脚本的第一行,#!之后应该是什么? 如果拿这个问题去问别人,不同的人的回答可能各不相同.我见过www.1.qixoo.com/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin

简单的shell脚本

1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下. 参考程序: C代码   #!/bin/sh FILENAME= echo "Input file name:" read FILENAME if [ -c "$FILENAME" ] then cp $FILENAME /dev fi 2.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30. 参考答

两个简单的shell脚本(关于启动和服务)

实验要求: 1.为root用户编写登陆欢迎脚本,报告当前主机中的进程数,已登陆用户数,根文件系统的磁盘使用率 2.编写三个脚本程序:start,stop和status,用来启动,停止各种系统服务 实验步骤: [[email protected] ~]# vi welcome.sh #!/bin/bash # this is test.by shengjie p=`ps aux | wc -l` //设置变量p echo "Running Processes:$p" u=`who | w

一个简单的shell脚本-----实现虚拟机实验环境的简单配置

亲自写过shell脚本后才发现,这玩意真是太方便了,当你想把一些琐碎的.细节性的小指令一次性来完成时,脚本无疑是最好的选择,方便.快捷,关键是真是懒人必备啊. 由于安装的centos6.5是最小化安装,且是实验环境,即安装在vmware workstations上面,在首次安装完成后,配置完IP地址的相关信息后,就做了一个初始的快照,以便下次实验完后,可以通过快照快速还原系统. 但是由于实验环境的要求,例如防火墙.SELinux.光盘挂载.yum源配置等,都是最常需要修改的选项,并且由于最小化安