首先说一下shell是什么?shell是联系用户和操作系统之间的一个壳,这个壳有很多版本,平时最常用的是bash shell。这么理解吧,ls即相当于跟操作系统沟通下达显示目录结构的命令
1 变量 变量的声明 修改.删除及使用规则
myname=zhuxinlei 首先,表达式左侧和右侧不能有空格。如果右侧的字符串需要有空格的时候用引号包含住字符串即可
删除的话非常简单unset myname
在使用过程中如果遇到使用变量的情况需要用双引号引用,而不单引号。就像php处理变量一样,双引号里面的东西能被解析成变量
2 环境变量
首先可以用env和export这两个命令来查看当前bash有多少个环境变量。下面讲解一下常用的环境变量
2.1 HOME 代表用户的家目录,平时我们用cd 后面不带参数就可以到自己的家目录,其实这跟cd $HOME的效果是一样的
2.2 SHELL 告诉我们当前用的是哪个shell
2.3 HISTSIZE bash会记录我们所做的操作,这个参数就是设置记录的条数的
2.4 MAIL 当我们使用mail这个命令时,系统会调用邮件信箱档案(mailbox)
2.5 PATH 执行文件搜索的路径,比如一个命令ls是否能执行就要看系统能否在path变量指定的文件中找到ls对应的二进制执行文件
2.6 LANG 语系参数
2.7 RANDOM 随机数
set命令可以观察所有变量,下面讲解一下set命令显示的变量
PS1(提示字符的设定,注意,这里PS是大写,1是数字1) 【root@localhost】设置是也!PS1的设定是特殊字符,默认为 PS1='[\u@\h \W]\$ ',这个值是可以改变的。知道有这个功能就行,不用非记住如何修改,谁没事闲的蛋疼改这个东西
变量的有效范围
export可以将局部变量转变成环境变量,具体的原理就不说了
变量的设定,上面说到了直接通过var=$varname这种形式来设置变量,我们也可以通过让用户键盘输入变量的内容来设置变量
2.8 read 从键盘读取变量值赋给变量
基本用法read varname,然后会等待用户输入变量的值。
read [-pt] variable
-p 可跟提示字符
-t 可跟等待时间
2.9 declare 宣告变量类型
declare [-aixr] variable 选项不参数:
-a:将后面名为 variable 的变量定义成为数组 (array) 类型
-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x :用法跟 export 一样,就是将后面的variable 发成环境发量;
-r :将变量定成为 readonly 类型,该发量不可被更改内容,也不能 unset
2.10 数组,数组是一种经常用的数据类型。现简单的说一下数组的声明和用法
数组的设定方式 var[index]=varname;
调用方式 ${var[index]}
比如说var[1]=zhuxinlei var[2]=eat var[3]=food
echo "${var[1]},${var[2],${var[3]}}"
2.11 文件系统及程序癿限刢关系: ulimit 限制用户的某些可用的系统资源,包括可以开吪癿档案数量, 可以使用癿 CPU 时间,可以使用癿内存总量等等(防止用户过度使用资源)
ulimit有很多的参数,这里只说三个。
-f可用设定的文件的最大值,
-l可用设定的使用的最大内存,
-t可用使用的最大cpu时间
2.12命令别名与历史命令
alias history
2.13 数据流重导向
数据流重导向:将执行命令产生的争取或错误的输出,改变输出地址。比如,平时我们使用ls命令,会将没有特定的执行命令,是否符号操作来完成。
学些shell
编写shell需要注意基本的三点:
一 首先要在脚本中指定处理文件用的shell,用 #!/bin/bash指定(这里指定/bin/bash来执行脚本文件)
二 使用#来注释
三 主要环境变量的宣告 PAHT 很重要
下面正式进入到shell的学习中来吧
虽然还没写一个字,但是看起来好紧张的样子
首先写一个最基本的hello world
#! bin/bash
echo 'hello world'
这是最最基本的shell脚本了,那如何执行呢?目前我只知道一种执行的方法即:假设刚才shell的名称为test.sh 则为 sh test.sh,告诉系统用什么shell来执行脚本
下面介绍几种简单的范例
1 对谈式脚本:变量内容由用户决定
这里要用到read命令,该命令的作用为等待用户输入内容,比如我们在安装软件的时候,会提示将软件安装在那个位置,这个位置是由用户自己指定的,现在我们让用户输入自己的名和姓,然后我们输出用户的全名
此时,执行该基本,会分别提示你输入first_name和last_name,然后自动为你组合出全名
2 随日期变化,利用date进行档案的建立
最常用的例子当然是备份了,比如我们备份数据库的时候如果是每天或者是每周备份的话,经常用到的肯定是以日期来命名了,这里就要用到date了
假设我们要建立一个档案,名称是用户自定义前缀然后跟上日期在加上后缀来命名,比如filename_20131213.bak,那如何写呢?date命令不会使用的自己去普及
紧急普及一下$()和${}的意义
$() 就是把括号里面的命令输出当作命令再执行。 ${ }就是取变量了,比如:echo ${PATH} $? 表示上一次程序退出值,上一次程序或脚本的退出码,主要是用来判断程序或脚本的执行是否成功,检查出错的原因之类的 $(())是用来作整数运算的。
执行shell会提示你输入文件名前缀,然后系统会自动创建一个文件
3 数值运算:简单的加减乘除
当变量定义成整数后才能执行运算,我们可以用$((运算))来进行数值运算,下面我们让用户两个值,来对他们进行相乘的运算
用户输入两个整数后,系统会自动计算出两个的相乘值。输入小数会出错,输入英文会为0
4 script的执行方式差异(source 、sh script.sh、 ./script.sh)
上面三个实例我们用的都是第二种方法来执行,第三种方法在我的系统下不能正常执行目前不太明白什么意思!!!
下面我们来说一下source执行和sh执行的不同
第三个例子中我定义了两个变量,$first和$second,用sh执行之后,在控制台打印此变量,没有值。用source执行执行,打印此变量,有值,即为刚才用户定义的
所以说用bash(或是sh)来执行脚本会在一个新的环境中执行,而source会在当前shell中执行
5 善用判断式
5.1 我们可以通过$? &&和||来判断前一个指令执行回传值对后一个执行是否执行,再次我们可以使用更为简洁的命令,test来判断。不懂test怎么用的自己去普及下吧
我们可以通过test判断文件是否存在,test本身返回值不会再控制台显示,所以我们可以通过&&和||来控制显示
test -e ./filename && echo "exist" ||echo "not exist"
ok,现在我们做一个测试,让用户输入一个文件名或者目录,
1 判断是否存在,如果存在则输出“exist”,若不存在则输出“not exist”
2并判断它的类型,如果它是个档案则输出 it is a directory,若果是一个文件则输出 it is a filename
3 判断执行者的身份对这个档案或目录的执行权限,并输出权限数据
用户输入名称,如果存在则会输出exist并继续往下执行,判断类型,并判断权限。如果不存在,则输出not exist并停止执行
5.2 利用判断符号--中括号[]
中括号在if判断中是非常重要的,[]里面有好多个参数,这里挑选最常用的讲解
d 当filename存在并且是目录时返回真
f 当file存在并且是文件时返回真
e当pathname存在并且是目录或者文件时返回真
r 当pathname存在并且可读时返回真
w 当pathname存在并且能写时返回真
x 当pathname存在并且能执行时返回真
s 当pathname存在并且大小大于0时返回真
上面都是写判断文件或者目录的方法,下面我们介绍几种判断字符的方法
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
6 shell的默认变数
2013.12.15 这里就简单的说一下吧,不相信说了,我觉得以后用到的机会不会很多,知道有这么回事就可以
每个命令都有自己的参数,比如ls -a可以查看隐藏的文件,那shell也可以有自己的参数,并且我们可以提示用户当前shell文件有哪些参数并且有什么作用
over
2013.12.21
现在详细讲解一下shell的默认变数(原来真的有用)
7 条件判断式,终于让我等来了你
简单的 判断我们可以使用上面讲到的&&和||,但复杂的我们肯定就要用到if了
7.1 if ....then
7.1.1 简单、单层条件判断式
这里需要注意的是空格,一定要加空格,if后面也要加then前面也要加
7.1.2 多重 复杂条件判断式
if...then else fi如果遇到更复杂的则用if...elif elif else fi,需要注意else后面没有then
先做一练习,判断用户输入是否为hello,如果是则提示用户“hello,how are you”,如果没有输入则提示用户“you need input para”,如果用户输入不是hello,提示用户“you must input hello”
上面只是一些很简单的没有实际意义的语法知识,现在我们来做一个实用的例子,这里需要用到grep和netstat,不会的童鞋先去普及下吧
netstat可以查询当前服务器开启的服务,它打印出来的信息其中包括类似于”127.0.0.1:80“这样的信息,表示允许对本机开发80端口,现在我们要侦测是否开发21 22 25 80这四个主要的网络端口
21 ftp 22 ssh 25 mail 80 www
使用这个脚本就可以测试你的主机有没有开启80端口
下面我们在做一个联系,判断时间差,让用户输入一个日期,判断和当天的差值。这里普及一下date +%s能输入当前日期的时间戳
7.2 case ....esac
它的用法和php中的switch case一样,也是用于判断,但似乎比if hen 更加方便,
判断用户输入内容,如果输入hello怎样,不输入会怎样,用法比较简单
7.3 function 即定义一个公共函数供脚本中使用,因为脚本是自上而下执行所以方法应该写在脚本的最上面
下面我们写一个例子,指定用户输入内容,并输出用户输入内容 you input the number is ...
function需要注意的是它也有属于自己的内建变量($0,$1...)这与shell自己的内建变量是冲突的,所以在使用时要注意,下面写一个例子来看一下
7.4 loop
7.5 while do done / until do done
while是当条件成立时执行,until是当条件成立时停止执行
下面我们分别用while和until做一个相同功能的联系,当用户输入yes或者YES的时候会停止执行,否则一直提示用户输入
下面我们看一下until的
下面我们来计算一下1+2+3....+100的值
7.6 for...do...done
上面只是一个非常简单的例子,几乎没有实用性。下面说一个实用点的,我们都知道密码信息都存储在/etc/passwd里面,下面我们打出密码里面的的用户名
for...do..done的数值处理
7.7 shell的追踪与debug
scripts 在执行乀前,最怕的就是出现语法错误的问题了!那举我们如何 debug 呢?有没有办法丌需要透过直接执行该 scripts 就可以来刞断是否有问题呢?呵呵!当然是有的!我们就直接以 bash 的相关参数来迚行刞断吧!
sh -nvx sh.sh
n 不执行shell,检查shell的语法。我测试了一下,不成功。我不依写错了语法也没有反应
v 执行shell前,将shell内容输出到屏幕上。有什么用呢?我想看自己就去看了,还用得着你?
x 将使用的shell内容显示到屏幕上,这个很有用,可以看到shell执行的逻辑
2013.12.23
历时半个月的shell基础知识终于告一段落了,明白了一些shell的基本原理和用法,更加努力的去迎接更复杂、更有趣和更实用的实用化shell!!!