一、关于shell
1. 什么是shell?
什么是shell?
Shell(外壳)是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
什么是脚本?
脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑)。
常见的脚本:JavaScript、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,其内部命令有53个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代。
ksh
Korn shell 的语法与 Bourne shell 相同,同时具备了C shell 的易用特点。许多安装脚本都使用 ksh,ksh有42条内部命令,与bash相比有一定的限制性。
tcsh
tcsh是csh的增强版,与 C shell 完全兼容。
sh
是一个快捷方式,已经被/bin/bash所取代。
nologin
指用户不能登录。 操作命令:usermod -s /sbin/nologin dalian
zsh
目前Linux里最庞大的一种shell:zsh。它有84个内部命令,使用起来也比较复杂。一般情况下不会使用该shell。
bash
大多数Linux系统默认使用的shell,base shell是Bourne shell的一个免费版本,它是最早的Unix shell,bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。
2. shell入门
编写规范:
代码规范:
#!/bin/bash 【指定告知系统当前这个脚本使用的shell解释器】
Shell相关指令
文件命名规范:
文件名.sh .sh是linux下 bash shell 的默认后缀
使用流程:
①创建.sh文件 touch/vim
②编写shell代码
③执行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
touch test2.sh
vim test2.sh
#!/bin/bash
useradd shelltest;
touch /home/shelltest/try.html;
chmod +x test2.sh
脚本执行的另一个方式:/bin/bash 脚本的路径(了解) /bin/bash test2.sh
Shell脚本分为简单的写法(简单命令的堆积)和复杂写法(程序的设计)
二、shell进阶(重点)
1. 变量(重点)
1.1 变量的含义
a. 什么是量:量就是数据
b. 什么是变量:数据可以发生改变就是变量。
在一个脚本周期内,其值可以发生改变的量就是变量。
c. 什么叫做一个脚本周期
一个脚本周期我们可以简单的理解为当前的shell文件,变量时shell中不可或缺的一部分,也是最基础。最终的组成部分。
1.2 变量的定义与使用
定义形如:class name=”yunwei”
使用形如:echo $class_name
变量就是由2部分组成,一个是变量名(左边),另一部分是变量的值(右边)
在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的(例如php)。
在定义变量的时候不能随便加空格!!!
关于单双引号的问题:
双引号能够识别变量,双引号能够实现转义。(类似于”*“)
单引号不能识别变量,只能原样输出,单引号不能转义。
案例1:使用变量改写入门脚本中第1个shell脚本。
案例2:定义一个变量,输出当前时间,要求格式为“年-月-日 时:分:秒”。
date +”%F %T” dt = date +'%F %T'
注意:反引号 `,当在脚本找那个需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”。
1.3 只读变量
语法:readonly 变量名
1.4 接受用户输入(重点)
语法:read -p 提示信息 变量名
案例:编写一个脚本 test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件,
1.5 删除变量(了解)
语法:unset 变量名
2. 条件判断语句
语法:
if [ condition1 ] //注意空格
then
command1
command2
...
elif [ condition2 ]
then
command1
else
command1
...
fi
单行写法(一般在命令行中):if[condition];then command;fi
3. 运算符
在shell中,运算符和其他编程脚本语言一样,多了文件测试运算符等。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如, awk 和expr。
expr是一款表达式计算工具。使用它能完成表达式的求职操作。
例如两个数相加:
#!/bin/bash
val=`expr 2 + 2`
echo "两个数之和为:$val"
a=10
b=20
echo ' a + b = ' `expr $a + $b`
注意两点:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数语言不一样。
完整的表达式要被``包含。
3.1 算数运算符
3.2 关系运算符
关系运算符支持数字,不支持字符串,除非字符串的值是数字。
运算符 说明
-eq 检测两个数是否相等,相等返回true equal
-ne 检测两个数是否相等,不相等返回true not equal
-gt 检测左边的数是否大于右边的,如果是则返回true great than
-lt 检测左边的数是否小于右边的,如果是则返回true less than
-ge 检测左边数是否大于等于右边的,如果是则返回true great than or equal
-le 检测左边的数是否小于等于右边的,如果是则返回true less than or equal
课堂作业:写一个脚本,当前输入的用户是否存在。如果存在则提示“用户存在”,否则提示“用户不存在”
3.3 逻辑运算符
运算符 说明
! 非运算
-o 或运算
-a 与运算
3.4 字符串运算符
运算符 说明
= 检测两个字符串是否相等
!= 检测两个字符串是否不等
-z 检测字符串长度是否为0 [ -z $a ]
-n 检测字符串长度是否为0,不为0返回true [ -n $a ]
str 检测字符串是否为空,不空返回true [ $a ]
3.5 文件测试运算符(重点)
操作符 说明
-d file 检测文件是否是目录,如果是则返回true
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件)
-r file 检测文件是否可读,如果是则返回true
-w file 检测文件是否可写,如果是则返回true
-x file 检测文件是否可执行,如果是则返回true
-s file 检测文件是否可执行,如果是则返回true
-e file 检测文件(包括目录)是否存在
4.shell脚本附带选项(重点)
问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?
步骤:
调用tail指令
系统内核把后续选项传递给tail
tail先去打开指定的文件
去除最后10行
问题:自己写的shell是否也可以像内置命令一样传递一些些选项呢?
答:可以的,传递方式与上述的描述是一样的,关键是怎样接收。例如:
传递:#./test.sh a b c
接收:在脚本中可以用“$1”来表示a,“$2”来表示b,以此类推。
接收可以用”$”加上选项对应的序号即可。
#!/bin/bash
echo $0 $1 $2 $3
//测试
#./test.sh a b c
练习:创建自定义指令“user”,可以直接执行,要求该指令具备以下语法和功能:
a. #user -add 用户名 【添加用户】
b. #user -del 用户名 【删除用户及其家目录】
#!/bin/bash
if [ $1 -eq 'add' ]
then
useradd $2
else
userdel -r $2
fi
因为题目要求user指令,所以需要定义别名
自定义别名:
vim ~/.bashrc
alias user=’/root/test15.sh’