Shell脚本基础(一)

前言:随着Linux系统在企业中的应用越来越多,服务器的自动化管理也越来越变得重要,在一些复杂的Linux维护工作中,大量的重复性的输出和交互式操作不但费时费力,而且容易出错,所以Shell脚本,可以批量处理,自动化完成一系列维护工作,大大减轻管理员的负担。

一,Shell脚本基础知识
1,编写第一个shell脚本
1),vim first.sh
[[email protected] ~]# mkdir /shell //创建一个shell目录
[[email protected] ~]# vim first.sh //新建first。sh文件
#!/bin/bash
cd /boot/
pwd
ls -lh vml
2),设置执行权限并执行
[[email protected] /]# chmod +x first.sh //添加可执行权限
[[email protected] /]# ./first.sh //直接运行脚本文件
/boot
-rwxr-xr-x. 1 root root 4.0M 11?.22 2013 vmlinuz-2.6.32-431.el6.x86_64
[[email protected] /]#
2.为脚本添加注释,友好输出,更容易读懂
1)
[[email protected] ~]# vim first.sh
~
#!/bin/bash
#this is my first shell-scipt
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml

2),执行./first.sh后如下
[[email protected] ~]# ./first.sh
当前的目录位于:
/boot
其中以vml开头的文件包括:
-rwxr-xr-x. 1 root root 4.0M 11?.22 2013 vmlinuz-2.6.32-431.el6.x86_64
[[email protected] ~]#
3,重定向操作
在Linux维护中,可以改变输入、输出内容的方向,而不是使用默认的标准输出、输出设备(键盘和显示器),这种操作成为“重定向”。
1),>表示重定向输出,>>表示重定向追加
[[email protected] ~]# uname -p > kernel.txt //将当前主机的CPU类型信息保存到kernel.txt文件中
[[email protected] ~]# cat kernel.txt
x86_64
[[email protected] ~]# uname -r >> kernel.txt //将内核版本追加到kernel.txt文件中
[[email protected] ~]# cat kernel.txt
x86_64
2.6.32-431.el6.x86_64
[[email protected] ~]#
2),重定向输入,<表示重定向输入
[[email protected] ~]# vim pass.txt //添加初始密码串内容“123456”
[[email protected] ~]# useradd chenpeng //添加用户“chenepng”
[[email protected] ~]# passwd --stdin chenpeng < pass.txt
//从pass.txt文件中取密码
Changing password for user chenpeng.
passwd: all authentication tokens updated successfully.
3),错误重定向,可用来收集程序执行的错误信息,为排错提供依据,例如:执行以下操作可以将使用tar命令备份时出现的错误信息保存到error.log文件中
[[email protected] ~]# tar kcf /noendir/etc/.tgz /etc/ 2> error.log
[[email protected] ~]# cat error.log
tar: /noendir/etc/.tgz:无法. open:没有那个文件或目录
tar: Error is not recoverable: exiting now
4)&>操作符可以将两类输出信息保存到同一个文件,例如,在编译源码包的自动化脚本中,若要忽略make,make install的操作的过程信息,可以将其定向到空文件/dev/null
首先下载httpd软件到本机,然后执行Vim httpd_install.sh,并输入如下内容:
[[email protected] ~]# vim httpd_install.sh
#!/bin/bash
cd /usr/src/httpd-2.2.17/
./configure --prefix=/usr/local/httpd --enable-so &> /dev/null
make &> /dev/null
make install &> /dev/null
设置权限chmod +x httpd_install.sh
最后执行./httpd_install.sh(注意/前的点)
4、管道操作
例子:使用grep命令查询使用/bin/bash作为shell的用户名称时,会输出符合条件的整行内容,在此基础上可以结合管道操作与Awk命令做进一步过滤,只输出用户名和登录shell列。
1)提取之前的正常效果
[[email protected] /]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
jerry:x:500:500::/home/jerry:/bin/bash
chenpeng:x:501:501::/home/chenpeng:/bin/bash
2)提取之后的效果,只显示用户名和shell列
[[email protected] /]# grep "/bin/bash$" /etc/passwd | awk -F: ‘{print $1,$7}‘
root /bin/bash
jerry /bin/bash
chenpeng /bin/bash
3)再例如:显示磁盘已用的百分比,可以执行以下操作,其中用到了df, grep,awk命令和管道操作
[[email protected] /]# df -hT | grep "/$" | awk ‘{print $6}‘
11%
二、使用shell变量
1、自定义变量:只在自己的shell环境中有效
1)定义新的变量和引用变量
Bash中的变量操作相对比较简单,不像其他高级编程语言(如C/C++,Java等)那么复杂。在定义一个新的变量时,一般不予要提前进行声明,而是直接指定变量名称并赋予初始值(内容)即可,
定义变量的基本格式为“变量值=变量值”,等号两边没有空格。变量的名称需以字母或者下划线开头,名称中不要包含特殊字符(如+、—、、/、.%、 &、 #、)
例如,若要定义一个名为“Product”的变量(值为Benet)和一个名为“Version”的变量(值为5.0),和查看引用变量的值,可执行一下操作:
[[email protected] /]# product=benet
[[email protected] /]# version=5.0
[[email protected] /]# echo $product
benet
[[email protected] /]# echo $product $version
benet 5.0
2、变量赋值的特殊操作
1)双引号的作用:赋值的内容包含空格时,例如:
[[email protected] /]# benet=benet 5.0 //错误的赋值
-bash: 5.0: command not found
[[email protected] /]# benet="benet 5.0" //正确的赋值
[[email protected] /]# echo $benet
benet 5.0
在双引号范围内,使用"$"符号可以引用其他的变量值
[[email protected] /]# ACCP="ACCP $Version" //以变量的值进行赋值
[[email protected] /]# Version=4.0
[[email protected] /]# echo $ACCP
ACCP 4.0
3)反撇号()的作用:用于将某个命令的输出结果赋值给变量,例如:<br/>[[email protected] /]# ls -lhwhich useradd`
-rwxr-x---. 1 root root 101K 12?. 8 2011 /usr/sbin/useradd
4)$()的作用:可以代替反撇号,解决嵌套问题,因为反撇号不能实现嵌套,例如:查询提供useradd命令程序的软件包所安装的配置文件位置.
[[email protected] /]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
5)read命令的作用:用来提示用户输入信息,例如:
[[email protected] /]# read todir1
/opt/backup/
[[email protected] /]# echo $todir1
/opt/backup/
[[email protected] /]# read -p "请指定备份存放目录:" todir2
请指定备份存放目录:/opt/backup
[[email protected] /]# echo $todir2
/opt/backup
3、设置变量的作用范围
新定义的变量只在当前shell有效,如果想进入新的shell环境同样有效,就需要使用export命令将变量导出为“全局变量”
[[email protected] /]# echo "$product $version"
benet 4.0
[[email protected] /]# export product version
[[email protected] /]# bash
[[email protected] /]# echo "$product $version"
benet 4.0
也可以在export导出全局变量的同时,也可以为变量赋值,例如:
[[email protected] /]# export web="www.google.com"
[[email protected] /]# echo $web
www.google.com
4,数值变量的运算
常用的几种运算符:
+:加法计算
—:减法计算
*:乘法计算,注意不能仅用“
”符号,否则将被当成文件通配符。
/:除法计算
%:求模运算,又称为取余运算,用来计算数值相处后的余数
示例如下:
[[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
若要将运算的结果赋值给其他变量,可以结合命令替换操作(使用反撇号),例如,计算Y的3次方,并将结果赋值给ycube
[[email protected] /]# ycube=expr $y \* $y \* $y
[[email protected] /]# echo $ycube
4096
三、特殊的shell变量
1、环境变量
环境变量系统安装好了就存在,不用创建,可以直接使用,我们先查看一下:
[[email protected] /]# env
HOSTNAME=localhost.localdomain
version=4.0
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
..................
我们可以把脚本直接添加到$PATH搜索路径中去,这样执行脚本的时候就不用加./了
[[email protected] ~]# cd /shell
[[email protected] shell]# ls
first.sh
[[email protected] shell]# first.sh //直接执行时找不到命令
-bash: first.sh: command not found
[[email protected] shell]# PATH="$PATH:/shell" //将//root添加到搜索路径
[[email protected] shell]# echo $PATH //查看修改后的搜索路径
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/shell
[[email protected] shell]# first.sh //直接以文件名运行脚本
当前目录位于:
/boot
其中以vml开头的文件包括
-rwxr-xr-x. 1 root root 4.0M 11?.22 2013 vmlinuz-2.6.32-431.el6.x86_64
环境变量的全局配置文件为/etc/profile,作用于所有用户,例如:将历史记录命令条数改为200条,只针对root用户
[[email protected] ~]# vim /root/.bash_profile
............//省略部分内容
export HISTSIZE=200 //需要添加的
只需要添加上面的最后一行,然后执行source /root/.bash_profile使之生效。
[[email protected] ~]# source /root/.bash_profile //读取并执行文件中的设置
[[email protected] ~]# history | wc -l //修改后的历史命令跳数
110
2、位置变量,例如求两个数的和
[[email protected] ~]# vim adder2num.sh
#!/bin/bash
sum=expr $1 + $2
echo "$1 + $2 = $sum"
[[email protected] /]# ./adder2num.sh 1 1
1 + 1 = 2
3、预定义变量,系统安装好之后就有,不能创建,只能使用,例如:$#表示命令行中位置参数的个数,$表示所有位置参数的内容,$?表示前一条命令执行后的返回状态,返回0表示正确。$0表示当前执行的脚本或程序的名称。
例如:制作备份数据脚本
[[email protected] /]# vim mybak.sh
#!/bin/bash
tarfile=beifen-date +$s.tgz
tar zcf $tarfile $
&> /dev/null
echo "已执行 $0 脚本"
echo "共完成 $# 个对象的备份"
echo "具体内容包括: $"
执行脚本./mybak.sh,备份两个文件
[[email protected] /]# ./mybak.sh /etc/passwd /etc/shadow
已执行 ./mybak,.sh 脚本,
共完成 2 个对象的备份
具体包括:/etc/passwd /etc/shadow
查看备份结果
[[email protected] /]# ls -lh beifen-

-rw-r--r-- 1 root root 3.4k Aug 17 23:29 beifen-1401972022.tgz
-rw-r--r-- 1 root root 3.4k Aug 17 23:29 beifen-1401972038.tgz

原文地址:http://blog.51cto.com/13557682/2066210

时间: 2024-08-15 12:33:08

Shell脚本基础(一)的相关文章

关于shell脚本基础编程第四篇

shell脚本基础编程第四篇本章主要内容:函数 函数 function:             function 名称 { 命令 ; } 或 name () { 命令 ; }           定义 shell 函数.               创建一个以 NAME 为名的 shell 函数.当作为一个简单的命令启用时,           NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令.当 NAME           被启用时,参数作为 $1...$n 被传递

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

shell脚本基础学习(转)

看到别人的学习总结,觉得不错转了过来(转自TryFly) 一.shell脚本基础 ? ?shell脚本是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正则表达式,管道命令以及重定向向等功能,以达到我们所想要的处理目的.它的基本用途有: 1.自动化常用命令 2.执行系统管理和故障排除 3.创建简单的应用程序 4.处理文本或文件 ... 二.创建shell脚本 第一步.使用文本编辑器来创建文本文件 第一行必须包括shell 声明序列:#!

shell脚本基础进阶(四)----作业

20150913-15作业 1.描述shell程序的运行原理(可附带必要的图形说明) shell脚本基础进阶(一)----shell介绍 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟) shell脚本基础进阶(二)----变量及运算符 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") shell脚本基础进阶(三)----流程控制语句

Linux运维之道之ENGINEER1.4(shell脚本基础)

ENGINEER1.4 SHELL脚本基础 认识shell环境 bash shell的使用方式 交互式: --人工干预,智能化程度高 --逐条解释执行,效率低 非交互式: --需要提前设计,智能化难度大: --批量执行,效率高: --方便在后台及悄悄地执行: 什么是shell脚本:提前设计可执行语句,用来完成特定任务的文件 --解释型程序 --顺序,批量执行 规范shell脚本的一般组成: #!环境声明 #注释文本 可执行代码 ----------------------------------

续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,

一. Vim续写 ?1.命令扩展模式的位置定界 ??起始位置 cmd 终止位置???Cmd:????y复制????d删除????Gu变大写????gu变小写??例如:0y$命令意味着:????0 先到行头????Y 从这里开始拷贝????$ 拷贝到本行行尾最后一个字符????Ye 从当前位置拷贝到本单词的最后一个字符 ?2.扩展命令模式:地址定界 ? ?# 具体第#行,? ?#1,#2 从开头数第#1行到第#2行? ?#1,+#2 从开头数的第#1行到从第#1行开始数的第#2行? ? ?例:2,

linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)

Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽量不要使用"_"下划线开头 最好做到见名知意 不能使用程序中的保留字,列如if,for等 1.3变量类型 字符型 数值型 整型浮点型 布尔型 条件是和否 #$echo $a 引用 abc 撤销 unset +(变量名)a 1.4变量操作 * 设置变量 * 引用变量 * 撤销变量 单引号和双

shell脚本基础、变量

shell脚本基础 知识要点 掌握Shell脚本的基础知识 学会使用Shell变量 学会编写简单的Shell脚本 Shell脚本的应用环境 学习shell脚本的基本流程 看.想.写 shell脚本用在什么地方 编写常用系统维护工具菜单 重要的性能参数.进程和日志分析 自动实现数据备份计划 自动批量搭建特定系统环境 防火墙自动配置脚本 服务器的配置文件安全比对 对批量设备进行远程巡检 Shell脚本的组成元素 shell脚本的基本组成 声明和注释* 系统命令 文本处理工具(grep.cut.sed