一:shell的作用及常见种类

shell是一个特殊的应用程序,介于操作系统内核和用户之间,复制接受用户输入的操作指令并进行解释,将要执行的操作传递给内核进行!因此,shell程序在系统中充当了“命令解释器”的角色!例如、windows中的cmd.exe就属于shell程序!

常见种类:

Bsh:是Bsh Shell的缩写,实现了最基本的命令解释器功能
Csh:是C Shell的缩写,与Bsh想必更适合交互操作
Ksh:是Korn Shell的缩写,结合了Bsh和Csh的功能优势
Bash:是Bourne Again Shell的缩写,目前大多的linux版本都用Bash作为默认shell
Zsh:是更多基于交互式操作考虑进行设计的Shell程序

二:shell环境的切换

[root@localhost ~] # cat /etc/shells(列出当前linux系统中能够使用的shell程序)

[root@localhost ~] # ls -l /bin/*sh(确认shell程序中存在的部分链接文件)
1.临时切换至新的shell环境

直接输入ksh或csh等即可直接切换[root@localhost ~] #ksh

2.更改用户自己的登陆shell(用户的登陆shell信息记录在/etc/passwd文件中)chsh命令进行修改

例:使用teacher用户登陆系统,并将自己的登陆shell更改为tcsh
[teacher@localhost ~] $ grep "teacher" /etc/passwd  (查看当前的登陆shell)
[teacher@localhost ~] $ chsh
Password:                      //输入当前用户账号的密码进行验证
New shell [/bin/bash] : /bin/tcsh       (更改登陆shell)
Shell changed.
[teacher@localhost ~] $ grep teacher /etc/passwd   (再次查看)

3.由管理员更改其他用户的登陆shell,使用usermod命令进行更改

例:由root用户使用usermod命令将teacher用户的登陆shell重新改为/bin/bash
[root@localhost ~] # usermod -s /bin/bash teacher (修改)
[root@localhost ~] # grep "teacher" /etc/passwd   (查看修改结果)

三:Bash常用功能

  • 命令历史
  • 命令别名
  • 标准输入输出和重定向
  • 管道操作

1.命令历史
可以按↑和下查看、还有“!”(用“!wh”调用历史命令中最近一次以“wh”开头的命令并执行)

查看历史命令列表
[root@localhost ~] # history | tail -3
[root@localhost ~] # !83        (可以查看第83条的历史命令)

设置记录历史命令的条数
[root@localhost ~] # vi /et/profile  (将其中的HISTSIZE=100,将历史命令条数设置为100,默认1000)
[teacher@localhost ~] $ vi ~/.bash_profile  (teacher用户自己也可以修改)

清除历史命令
[teacher@localhost ~] $ history -c

2.命令别名
alias可以查看已设置的命令别名
[root@localhost ~] # alias dir='/bin/ls -ld /home'   (将ls -ld /home设置为别名dir)

取消已设置的别名、结合-a即可
[root@localhost ~] # unalias dir   (取消单个的别名)
[root@localhost ~] # unalias -a    (取消所有别名)

3.标准输入输出和重定向
标准输入(文件编号0)、标准输出(文件编号1)、标准错误(文件编号2)

---标准输出重定向---
“>”或“>>”分别用户覆盖和追加
例:查看teacher用户的身份信息,将输入结果保存到idtch.txt中
[root@localhost ~] # id teacher > idtch.txt
例:查看jerry用户的身份信息,并追加到idtch.txt中,不覆盖文件原有的内容
[root@localhost ~] # id jerry >> idtch.txt

---标准输入重定向---
使用"<"操作符
例:在文件"pw.txt"中保存初始密码“123456”,并使用该文件为jerry用户设置密码,方便!
[root@localhost ~] # vi  pw.txt
[root@localhost ~] # passwd --stdin jerry < pw.txt

---标准错误重定向---
使用“2>”
例:尝试使用help命令查看ls命令帮助信息,由于ls并非内部命令,系统将会报错,通过“2>”将报错信息重定向到指定的文件中
[root@localhost ~] # help ls 2> err.log(2>>和>>的作用一样)

4.管道操作“|”
作用是将管道左边的命令的输出结果作为右侧命令的处理对象

例:过滤出/etc/inittab文件中不以#号开头的行,并再次过滤出非空行,将结果重定向保存为inittab.txt文件
[root@localhost ~] # grep -v "^#" /etc/inittab | grep -v "^$" > inittab.txt

例:找出系统中使用Bash作为登陆shell,名称以ha开头的用户账号,并只显示用户名、登陆shell两个字段的内容
[root@localhost ~] # grep "bash" /etc/passwd | grep "^ha" | cut -d ":" -f 1,7

例:查看当前系统的总内存空间、剩余可用内存空间、去除其他无关信息
[root@localhost ~] # free -m | grep "Mem“ | awk '{print $2,$4}'

awk和cut作用相似、用于输出指定字段的信息!

四:shell变量的应用

  • 用户自定义变量
  • 环境变量
  • 预定义变量
  • 位置变量

一:用户自定义变量
1.定义新变量
变量名=变量值
例:新建一个名为"DAY变量,初始内容设置为“Sunday"
[root@localhost ~] # DAY=Sunday

2.查看和引用变量值
[root@localhost ~] # echo $DAY           (echo输出要加$符号)
例:在变量DAY的内容后紧跟"MorningBus"
[root@localhost ~] # echo ${DAY}MorningBus  (方便区分要将变量括起来)

3.为变量赋值的常用方法

双引号(")、引号中可以引用变量
例:确认变量DAY的内容,并使用双引号TODAY变量赋值“Today is $DAY”
[root@localhost ~] # TODAY="Today is $DAY"

单引号(')、引号中不允许引用变量,所有字符都将作为普通字符
例:确认变量DAY的内容,并使用单引号TODAY变量赋值“Today is $DAY”
[root@localhost ~] # TODAY='Today is $DAY'
[root@localhost ~] # echo $TODAY
Today is $DAY   (输出结果没有被引用)

反撇号(`)、反撇号中只能存在命令
例:统计当前登录到本地终端(tty1-tty6)中的用户数量,并将结果保存到变量UserNum中
[root@localhost ~] # UserNum=`w | grep "tty" | wc -l`

read命令、可以实现简单的交互操作,以空格作为分隔符
例:从键盘输入一整行数据、依次赋给G1、G2,并确认G1、G2变量的内容
[root@localhost ~] # read G1 G2
Good morning , teacher                   (键盘输入)
[root@localhost ~] # echo $G1       (查询)
Good
[root@localhost ~] # echo $G2
moring , teacher

设置变量的作用范围、默认情况下用户自定义的变量只能在当前的shell环境中执行,称为局部变量、转换为全局变量之后可以再其他shell环境中使用
exprot命令可以转换
[root@localhost ~] # export DAY

清除自定义变量(unset命令)
例:清除已设置的变量DAY、MONTH、YEAR
[root@localhost ~] # unset DAY MONTH YEAR

数值变量的运算
一般只适合进行简单的整数运算
expr 变量1 运算符 变量2
运算符:+ 、- 、\* (乘)、/ 、%(求模,即余数)
例:设置变量X、Y的值分别为22、33,依次计算变量X、Y的加减乘除及取模的运算结果
[root@localhost ~] # X=22
[root@localhost ~] # Y=33
[root@localhost ~] # expr $X + $Y
[root@localhost ~] # expr $X - $Y
[root@localhost ~] # expr $X\* $Y
[root@localhost ~] # expr $X / $Y
[root@localhost ~] # expr $X % $Y

例:计算变量X的值与数值123的和,并将计算结果重新赋值给X
[root@localhost ~] # echo $X
22
[root@localhost ~] # X=`expr $X + 123`
[root@localhost ~] # echo $X
145

二:环境变量

用户登录后linux系统预先设定好的一类shell变量,功能是设置用户的shell工作环境

查看环境变量
[root@localhost ~] # set | less

例:确认当前的命令搜索路径,将/opt/bin目录添加到现有的搜索路径中去
[root@localhost ~] # echo $PATH
[root@localhost ~] # PATH="/opt/bin:$PATH"

例:编辑“~/.bash_profile”文件,修改PATH的设置,以便用户下次登录后能使用/opt/bin目录作为默认搜索路径
[root@localhost ~] # vi ~/.bash_profile
PATH=$PATH:HOME/bin:/opt/bin
export PATH

三:位置变量

为了方便通过命令行给程序提供操作参数,引入了位置变量!shell命令执行时,除了输入第一个字段外,其余字符串按照从左到右顺序依次赋值给位置变量

例:执行“service network restart”命令时,service脚本程序的第一个位置参数用$1表示,对应的值为"network",第二个位置参数用$2表示,对应的值为restart

四:预定义变量

$#:表示命令行中位置参数的数量
$*:表示所有位置参数的内容
$?:表示命令执行后的状态,检查命令执行是否正确!为0正确,其他错误
$$:表示当前进程的进程号
$!:表示后台运行的最后一个进程的进程号
$0:表示当前执行的进程的进程名

三:编写shell脚本文件

shell脚本包括的内容:运行环境设置、注释行、可执行语句

例:由于公司的文件服务器空间有限,需要完成一项定期任务!每周五下班前(17:30)检查公共共享目录/var/ftp/pub中的内容,并将其中所有子目录及文件的详细列表和当时的时间信息追加保存到/var/log/pubdir.log日志文件中,然后清空该目录中的内容
1)编写脚本文件ftpclean.sh,并添加执行权限
[root@localhost ~] # vi /opt/ftpclean.sh
#! /bin/bash
date >> /var/log/pubdir.log
ls -lhR /var/ftp/pub >> /var/log/pubdir.log
rm -rf /var/ftp/pub/*
[root@localhost ~] # chmod a+x /opt/ftpclean.sh
2)设置计划任务并确认crond服务已经启动
[root@localhost ~] # crontab -e
30 17 * * 5 /opt/ftpclean.sh
[root@localhost ~] # service crond status
[root@localhost ~] # chkconfig --level 35 crond on


例:公司内网开发服务器中的数据库目录位于/var/lib/mysql,根据数据安全管理要求,至少每隔三天要做一次完整备份,备份前需要统计该目录占用的总空间大小,并将备份日期、目录空间大小等信息保存到临时文件/tmp/dbinfo.txt中,然后使用tar命令将dbinfo.txt文件随数据库目录一起备份到/opt/dbbak目录中,备份包文件名中要求体现当天的日期

1)创建保存备份文件的目录/opt/dbbak
[root@localhost ~] # mkdir /opt/dbbak
2)编写脚本文件dbbak.sh并添加执行权限
[root@localhost ~] # vi /opt/dbbak.sh
#! /bin/bash
DAY=`date "+%Y%m%d"`
SIZE=`du -sh /var/lib/mysql`
echo "Date:$DAY" >> /tmp/dbinfo.txt
tar zcvf /opt/dbbak/mysqlbak-${DAY}.tar.gz /var/lib/mysql /tmp/dbinfo.txt
rm -f /tmp/dbinfo.txt
[root@localhost ~] # chmod a+x /opt/dbbak.sh
3)设置计划任务并确认crond服务已经启动
[root@localhost ~] # crontab -e
55 23 */3 * * /opt/dbbak.sh
[root@localhost ~] # service crond status
[root@localhost ~] # chkconfig --level 35 crond on

结束!