1.shell脚本
1.1什么是shell
在计算机科学中,Shell俗称壳(用来区别于核),是指=“为使用者提供操作界面”的软件(命令解析器)。
我们常用的shell有:bash,ksch,tcsh,csh,sh。shell是一个应用程序是保护内核的一个壳。
操作系统中运行程序时,有主次之分,他们的调度是由内核决定,但是我们不能让程序与内核直接接触,因为内核没有判断是否恶意的能力,直接交流会更改内核,对优先级进行篡改,所以我们外加一个壳(shell),以供用户与内核之间交流的接口,恶意程序shell过滤掉,安全程序要求给内核。
1.2什么是shell脚本
Shell Script ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
脚本是由文本组成,脚本是不用编译的。长脚是为了跑起来,能够用文本名称,运行文本内容的,是为了记录我们的操作步骤,进行批处理。
所有的程序是由数据和逻辑组成,脚本是一种解释性的语言,将所有的代码解释给系统听,开启一个解析器,在系统中直接运行的,解释器叫shell,所以他叫shell脚本。(python,perl同理都是以解释器命名)。
脚本是以.sh结尾的,.sh结尾是为了告诉系统这是一个脚本。
2.新建一个shell脚本
我们在新建一个脚本时,我们首先必须要新建一个以.sh结尾的文件,.sh结尾是为了告诉系统这是一个脚本。
然后我们在脚本里写入用哪个shell程序运行脚本。#!/bin/bash(在Linux文件中并不是以#开头就是注释)。
一般我们为了规范性我们会写入以下内容:作者(Author),日期(Date),邮件(Mail),版本(Virsion),脚本描述(Description)。
2.1手动建立脚本
2.2 自动建立脚本
我们在日常的工作中总不能,每写一个脚本就将所有的标题内容书写一边,重复性的动作我们都可以批量完成,所以我们先在就开始自动建立脚本,自动建立脚本有以下两种方式:1.快捷键添加 2.新文件自动添加。
2.2.1快捷键添加
我们可以将设定修改在vim的主配置文件中==/etc/vimrc==
在其中写入只要是以.sh结尾的文件只要按下F9就可以添加标题内容。具体操作如下。
总结知识点:在这个实验中我们主要使用以下两个命令:
map <F9> ms:call SONG()<cr>'s 映射某一个快捷键做某一个函数的标准书写方式。
".strftime(%H-%m-%d %h-%M)."输出标准的系统时间。
2.2.2 新闻件自动添加
同样在主配置文件中添加更改==/etc/vimrc==
只要是新建文件就就会自动生成,操作如下:
总结知识点:
1.学习使用自动使用函数命令
autocmd BufNewFile *.sh exec ":call SONG()"
2.touch生成的文件,在touch命令结束后就不算是新文件了,vim新建文件,只要你没有退出、保存,他就是一个系统承认的新文件。
3.脚本的运行
要使一个脚本运行起来我们有以下四种方式
sh file.sh | 使用sh运行一个脚本 |
---|---|
source file.sh | |
. file.sh | |
./file.sh |
他们又有什么不同之处呢?接下来我们实验证明。
3.1 sh运行脚本
总结:由实验结果可以看出我们在当前bash命令解释其中,使用了sh命令解释器,解释运行这个脚本,但是我们并,没有新开启一个shell界面。
3.2 source 与 . 运行脚本
总结:通过实验我们可以得出source与 . 是同样的运行效果,都是在当前的命令解释器中执行这个脚本内容,. 是source的缩写。
3.3 ./执行脚本内容
其实这里的. /就相当于当前的所在位置路径。
总结:使用. /运行脚本时,器是是使用脚本中指定的命令解释器运行脚本
4.脚本的调试
我们在刚开始学习编写脚本时,难免出错这时如果运行脚本迟迟没有出现结果,卡在运行不动时,我们就无法得知到底是哪一条出现了问题,所以就出现了查看脚本运行的命令:
sh -x file.sh 适用于所有的shell脚本
操作如下:
这时就可以更改错误的地方,调整脚本。
5.脚本小试
我们已经学习了脚本的建立,执行,与调整,先在我们就自己写几个脚本试试吧!
5.1 显示当前主机ip
题目:编写脚本ip_show.sh,显示当前的地址ip。
开动你的脑筋想想吧。
5.2 显示当前能登陆主机的用户
题目:编写user_show.sh,显示当前能登陆主机的用户。
5.3 清空系统日志
题目:编写一个clear_log.sh脚本,执行脚本后可以清空日志。
6.shell的变量
6.1 变量的定义
变量即在程序运行过程中它的值是允许改变的量,是一串固定的字符来标示不固定的值的一种方法,变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Scritpt运行时可更改的程序信息。
6.2系统中的变量
6.2.1 环境级变量
环境级export 是告诉所有人一个信息(声明),如果关掉声明bash,就会遗忘声明变量。
总结:环境级变量是在此时的环境中会有记忆,一旦切换环境就不再记得环境变量的值,所以我们使用export声明定义环境变量,就相当于大声的告诉所有环境这个变量和他的值,但是这个声明变量是一个临时的声明,只要你关掉声明环境,声明就消失,关于这个变量的一切信息全部消失.
6.2.2用户级变量
用户级变量我们需要修改用户级的环境变量配置文件. /bash_profile,此文件在用户自己的家目录下,ls -a 可以查看(. *代表隐藏文件)。
总结:用户级变量是对这个用户的所有环境而言,而一旦切换用户,别的用户环境中时没有任何有关此变量的信息的。
6.2.3 系统级变量
6.2.3.1 系统中存在的系统级变量
所有的直接在命令解释器中定义的变量一旦切换环境就会,失效,PS1在系统变量中所以我们切换环境后他就会变回去。
6.3 字符的转义及变量的声明
\ | 转义单个字符 |
---|---|
" " | 弱引用,批量转义" "中出现的字符 |
’ ’ | 强引用,批量转义’ '中出现的字符 |
${ } | 变量声明 |
我们得到:" "=不能使!、\ 、` 、$ ,作为普通符号输出,这时候我们就要使用’ '强引用字符输出特殊符号。
学习了字符的转义,我们就做一道题。
我们给user文件中写入三个用户名,此题需要我们写一个脚本将此文件中的三个用户名生成为系统中真实存在的用户。
再将passwd作为密码给相应用户的密码。
6.4 变量值传递
$1 | 脚本后跟的第一串字符 |
---|---|
$2 | 脚本后跟的第二串字符 |
$3 | 脚本后跟的第三串字符 |
$# | 脚本后所跟字符串个数 |
$* | 脚本后所跟的所有的字符串,“1 2 3 ” |
$@ | 脚本后所跟的所有的字符串, “1” “2” “3” |
$0 | 脚本本身名 |
题目:建立脚本,脚本后跟-c表示建立用户设定密码,脚本后跟-d表示删除用户,脚本后跟其他字符,报错退出。
提示:
read -p " #########" USER 交互式,将#########输出,将输入定义给USER
read -p " #########" -s PASS 输入不回显,定义给PASS
6.5 命令别名设定
在系统中我们用alias定义命令的别名,也可以将其写在环境配置文件中,修改命令别名,具体操作如下。
6.6 利用命令执行结果设定变量
我们可以通过以下方式:
Hostname=$(hostname)
Hostname=`hostname`
以上两种都表示将hostname执行完后将结果符只给Hostname变量。
退出值:
$?在命令执行完后产生的退出值,退出值的范围一般是[0-255]
当$?的值为0时,表示正常退出,其他值表示异常退出。
7.函数
脚本中的函数时把一个复杂的语句快定义为一串字符,由函数名USER_CREATE,输入(),函数体{ }组成。