1、什么是shell
什么是shell’?
Shell (外壳)是- 一个用C语言编写的程序,它是用户使用Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
什么是脚本?
脚本简单地说就是一条 条的文字命令,这些文字命令 是可以看到的 (如可 以用记事本打开查看、編辑)。常见的脚本: JavaScript(js,前端,常见), VBScript, ASP, (JSP, PHP, 后端)(SQL, 数据库操作语言)Perl, Shell, python, Ruby, JavaFX,Lua等。
为什么要学习和使用shell?
shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理),语法简单,代码写起来比较轻松,简单易学
常见的shell种类?
在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,**Linux中默认的shell是/bin/bash,**流行的shell有ash、bash、ksh、 csh、zsh等,不同的shell都有自己的特点以及用途。
csh
C shell使用的是“类C”语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh 所取代。
ksh
Korn shell的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh ,ksh有42条内部命令,与bash相比有-定的限制性。
tcsh
tcsh是csh的增强版,与Cshell 完全兼容。
sh
是一个快捷方式,已经被/bin/bash 所取代。
nologin
指用户不能登录
zsh
目前Linux里最庞大的一种shell:zsh。它有84个内部命令,使用起来也比较复杂。一般情况下,不会使用该shell.
bash
大多数Linux系统默认使用的shell, bash shell是Bourne shell的一个免费版本, 它是最早的Unixshell,bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell 脚本都会指定它为执行路经。
————————————————————————————————————————————————————————————————————————————————————————————————
2.shell入门
编写规范;
使用流程;
案例1:创建test.sh,实现第一个shell脚本程序,输出hello world.
输出命令: #echo 123
注意:输出的内容如果包含字母和符号(不包含变量),则需要用引号包括起来。如果是纯数字可以包也可以不包。
注意,这里在运行时一定要写成./test.sh, 而不是test.sh, 运行其它二进制的程序也样,直接写test.sh, Linux 系统会去PATH (环境变量)里寻找有没有叫test.sh 的,而只有/bin, /sbin, /usr/bin, /usr/sbin 等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh 告诉系统说,就在当前目录找。
案例2:使用root用户帐号创建并执行test2.sh,实现创建一个 shelltest用户,并在其家目录中新建文件try.html。
脚本执行的另外一个方式: /bin/bash 脚本的路径(了解)
Shell脚本分为简单的写法(简单命令的堆积)和复杂写法(程序的设计)
————————————————————————————————————————————————————————————————————————————————————————————————
二、shell进阶
1、变量
1.1、变量的含义
a.什么是量
量就是数据.
b.什么是变量
数据可以发生改变就是变量.
在一个脚本周期内,其值可以发生改变的量就是变量.
c.什么叫做一个脚本周期
一个脚本周期我们可以简单的理解为当前的shell文件
1.2、变量的定义与使用
变量,先定义后使用。
定义形如: class name="yunwei "
使用形如: echo $class name
变量就是由2部分组成,一个是变量名(左边),另外一部分是变量的值(右边)
变量名和变量值是什么关系?
变量名和变量值是使用和被使用关系;我们的变量名来使用变量值。
在使用变量的时候一定需要在变量名前面添加一个“$”符号,该要求在其他语言中也存在的(例如php)。
案例1:使用变量改写入门脚本中的第1个shell脚本。
关于单双引号的问题:
双引号能够识别变量,双引号能实现转义(类似于“\*”)
单引号是不能识别变量,只会原样输出,单引号是不能转义的
案例2:定义一个变量,输出当前时间,要求格式为“年月-日时:分:秒 ”
注意:反引号(esc 键下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”
1.3、只读变量
语法: readonly 变量名
案例:定义变量a并且其值为10,随后设置其为只读变量,再去尝试重新赋值
1.4、接收用户输入
语法: read -p 提示信息 变量名
案例:编写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径),然店自动为用户创建该文件
1.5、删除变量
语法: urpset 变量名
案例:定义变量b=20,再输出b的值,随后删除b,最后再输出下b
2、条件判断语句
老婆给当程序员的老公打电话:下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。当晚,程序员老公手捧一个包子进了家门老婆怒道:你怎么就买了一个包子? !老公答曰:因为看到了卖西瓜的。
把程序员老婆的话当作一段需 求分析一下吧。买一斤包子是一个确定无疑的需求项,无论后面是什么情况什么条件,前面这一斤包子是肯定要买的。看到卖西瓜的是一个条件判断,后面“买一个”是一个模糊不清的需求项,买一个什么呢?需求里没说啊。客户把这个当作开发人员默认了解的内容了。可是作为一个成熟合格的程序员,该老婆的丈夫应该马上跟进确认需求“买一个什么?”,要不然程序可怎么写呢?所以笑话里该程序员是不合格的,起码是不积极不负责的。在没有明确需求的情况下,他只能按照自己的理解来完成工作了。那比较可能的结果就有如下几种;
1、看到卖西瓜的,买一个西瓜
如果看到卖西瓜的
那么
买一个西瓜
否则
买一斤包子
2、看到卖西瓜的,买一个包子
如果看到卖西瓜的
那么
买一个包子
上述1和2下面的条件汉字描述称之为“伪代码”,也属于条件表达式得语法。
语法1:(一个条件)
if condition
then
command1
command2
...
fi
单行写法(一般在命令行中执行的时候): if [ condition ]; then command; fi
语法2:(二个条件)
if condition
then
command1
command2
...
else
command
fi
语法3:(多个条件)
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
3、运算符
在shel中,运算符和其他编程脚本语言一样, 常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等。
3.1、算数运算符
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b]是错误的,必须写成[$a== $b]。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。
expr是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号`而不是单引号) :
#/bin/bash
val=` expr2 + 2`
echo "两数之和为: $val!"
两点注意:
表达式和运算符之间要有空格,例如2+2是不对的,必须写成2+2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被``包含,注意这个字符不是常用的单引号,在Esc 键下边。
案例:使用a=10,b=20 来实现本案例
结果:
3.2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
案例使用a=10,b=20 来实现本案例
结果:
3.3、逻辑运算符
非运算:取反得意思
或运算: 一个为真即为真,全部为假才是假
与运算:一个为假即为假,全部为真才是真
案例:
结果:
3.4、字符串运算符
案例:
结果;
3.5、 文件测试运算符
文件测试运算符用于检测Unix/Linux文件的各种属性。
案例:测试上述标绿色的效果
结果:
注意:权限几个判断,如果只有一个部分符合,则认为是有权限的。
————————————————————————————————————————————————————————————————————————————————————————————————
4、 shell脚本附带选项
问题描述:在linux shell中如何处理tail -10 access.log这样的命令行选项?
步骤:
调用tail 指令
系统把后续选项传递给tail
tail先去打开指定的文件
取出最后10行
问题:自己写的shell是否也可以像内置命令一样传递一 些选项呢?
答:可以的,传递方式与上述的描述是一样的,关键是怎么接收。例如:
传递:
#./test.sh a b c
接收:
在脚本中可以用“$1”来表示a,“$2”来表示b,以此类推。
接收可以用“$”加上选项对应的序号即可。
测试:编写test14.sh,传递a, b, c,输出其值
其实$1、S2是变量。
练习:创建自定义指令“user”可以直接执行,要求该指令具备以下语法和功能: .
a. #user-add 用户名 [添加用户]
b. #user-del 用户名 [删除用户及其家目录]
同时题目中要求是指令,所以可以再去添加个别名: