linux 理解shell

首先说一下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!!!








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值