shell bash shell 变量 shell 脚本 杨书凡
在一些复杂的 Linux 维护工作中,大量重复性的输入和操作不但费时费力,而且容易出错,而编写一个恰到好处的 shell 脚本程序,可以批量处理、自动化的完成一系列维护任务,大大减轻了管理员的负担
shell 脚本基础
1. 编写第一个 shell 脚本
Linux 中的 shell 脚本是一个特殊的应用程序,介于操作系统内核和用户之间,充当了一个命令解释器的角色,负责接收用户的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果
常见的 shell 解释器
可通过 / etc/shells 文件了解当前系统所支持的 shell 种类。而 / bin/bash 是大多数 Linux 默认的 shell 脚本
- [root@localhost ~]# cat /etc/shells
- /bin/sh
- /bin/bash
- /sbin/nologin
- …… //省略部分内容
编写脚本文件
将平时使用的各种 Linux 命令按顺序保存到一个文本文件,然后添加执行权限,这个文件就是一个 shell 脚本了
- [root@localhost ~]# vim first.sh //新建first.sh文件
- #!/bin/bash //脚本声明
- # This is my first Shell-Script. //注释信息
- cd /boot //可执行语句
- pwd
- ls -lh vml*
- [root@localhost ~]# . first.sh //以下四种方式可执行脚本
- [root@localhost ~]# sh first.sh
- [root@localhost ~]# source first.sh
- [root@localhost ~]# chmod +x first.sh
- [root@localhost ~]# ./first.sh //这种方式需要文件有x权限,而上面三种不需要
2. 重定向与管道操作
(1)重定向操作
Linux 系统使用文件来描述各种硬件、设备等资源。而用户通过操作系统处理信息的过程中,包括以下几类交互设备文件:
在实际 Linux 系统维护中,可以改变输出、输入内容的方向,不使用默认的标准输入、输出设备,这种操作称为重定向
(2)管道操作
管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号 "|" 左侧的命令输出的结果,作为右侧命令的处理对象,同一个命令中可以有多个管道
- [root@localhost ~]# grep "bash$ " /etc/passwd
- root:x:0:0:root:/root:/bin/bash
- teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash
- [root@localhost ~]# 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 $ 变量名
- [root@localhost ~]# xing=yang
- [root@localhost ~]# ming=shufan
- [root@localhost ~]# echo $xing
- yang
- [root@localhost ~]# echo $xing $ming
- yang shufan
- [root@localhost ~]# echo ${xing}shufan
- yangshufan
(3)变量赋值的特殊操作
赋值时使用引号:
双引号("):当赋值内容中包含空格时,必须使用双引号,允许通过 $ 符号引用其他变量值
单引号('):当赋值内容中包含特殊字符时,必须使用单引号
反撇号(`):命令替换,提取命令执行后的输出结果
- [root@localhost ~]# xingming="yang $ming" //双引号的应用
- [root@localhost ~]# echo $xingming
- yang shufan
- [root@localhost ~]# xingming='yang $ming' //单引号的应用
- [root@localhost ~]# echo $xingming
- yang $ming
- [root@localhost ~]# aaa=`grep "bash$" /etc/passwd` //反撇号的应用
- [root@localhost ~]# echo $aaa
- root:x:0:0:root:/root:/bin/bash
除了上述情况可以赋值外,还可以使用 read 命令进行赋值
- [root@localhost ~]# read xing
- yang
- [root@localhost ~]# echo $xing
- yang
(4)设置变量的作用范围
默认情况下,新定义的变量只在当前 shell 环境中有效,称为局部变量,当进入子程序或新的子 shell 环境时,将无法使用。为了使用户自定义的变量在多有子 shell 环境中能继续使用,可以通过内部命令 export 将指定变量导出为 "全局变量",可同时指定多个变量名作为参数,变量名之间以逗号分隔
- [root@localhost ~]# echo $xing $ming
- yang shufan
- [root@localhost ~]# export xing ming //将xing、ming设为全局变量
- [root@localhost ~]# bash //进入子shell环境
- [root@localhost ~]# echo $xing $ming //调用父shell的全局变量
- yang shufan
- [root@localhost ~]# exit //返回原有的shell环境
- [root@localhost ~]# export xingming=yangshufan
- [root@localhost ~]# echo $xingming //新建一个名为xingming的全局变量
- yangshufan
(5)数值变量的运算
在 bash shell 环境中,只能进行简单的整数运算,不支持小数运算,通过 expr 命令进行,格式如下:
expr 变量 1 运算符 变量 2 [运算符 变量 3] ...
常用的几种运算符如下所示:
加法运算:+
减法运算:-
乘法运算:\* 不能仅使用 *,否则将当成文件通配符
除法运算:/
求模(取余)运算:% 计算数值相除后的余数
- [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
- [root@localhost ~]# abc=`expr $x + $y ` //将运算结果赋值给变量abc
- [root@localhost ~]# echo $abc
- 51
2. 环境变量
环境变量由系统提前创建的一类变量,主要用户设置用户的工作环境,由 Linux 系统自动维护,会随着用户状态的改变而改变,可以使用 env 命令查看当前工作环境下的环境变量
PATH 变量用于可执行程序的默认搜索路径
- [root@localhost ~]# echo $PATH
- /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- [root@localhost ~]# PATH="$PATH:/root"
- [root@localhost ~]# 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 表示
- [root@localhost ~]# vim xxx.sh
- #!/bin/bash
- sum='expr $1 + $2'
- echo "$1 + $2 = $sum"
- [root@localhost ~]# . xxx.sh 12 34
- 12 + 34 = 46
- [root@localhost ~]# . xxx.sh 10 50
- 10 + 50 = 60
4. 预定义变量
预定义变量是由 bash 程序预先定义好的一类特殊的变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能为预定义变量赋值。使用 $ 符号和另一个符号组合表示,下面是几个常用的预定义变量:
$#:表示命令行中位置参数的个数
$*:表示所有位置参数的内容
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,非 0 表示执行异常
$0:表示当前执行的脚本或程序的名称
- [root@localhost ~]# cat mybak.sh
- #!/bin/bash
- TARFILE=beifen-`date +%s`.tgz
- tar zcf $TARFILE $* &> /dev/null
- echo "已执行 $0 脚本,"
- echo "共完成 $# 个对象的备份"
- echo "具体内容包括: $*"
- [root@localhost ~]# ./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)设置计划任务
shell bash shell 变量 shell 脚本 杨书凡
原文:http://blog.51cto.com/yangshufan/2051929
来源: http://www.bubuko.com/infodetail-2433705.html