今日笔记:
shell编程(脚本):
(1)shell 编程
编程:分为编译型和解释型
C语言-----编译型
脚本语言-----解释型(由解释器来帮助完成用户和内核的交互)
(2)命令,shell,shell编程
命令:用户和内核进行交互的指令(经过一个shell来进行解释)
shell:命令行解释器,相当于用户和内核之间交互的桥梁
shell编程(脚本):shell命令的有序集合
(3)shell 的分类
可以分为4类:
第一类:sh (bournel shell)--->首发的版本,但是不支持Tab键,上下键翻阅历史命令,通配符
第二类:csh ----->编程风格类似于C语言,但是不够健壮
第三类:ksh ------>收费版本,需要许可证
第四类:bash(bournel again shell )--->是sh 的增强版,支持Tab键,上下键翻阅历史命令,通配符
(4)shell编程的书写格式
首先:首行顶格书写:#!/bin/bash ---->交代了解释器所在的位置
其次:按照语法格式进行书写即可
(5)shell编程的书写步骤
第一步:先新建并打开一个后缀名为.sh的文件 ----->vim test.sh
第二步:修改该文件的权限为可执行 ----->chmod +x test.sh
第三步:直接运行该可执行文件即可 ------> ./test.sh
注:要想直接运行test.sh可以将包含该可执行文件的路径的添加到环境变量中去,添加的方式:
方式1:临时修该---》即:在当前终端上输入以下命令:export PATH=~/linuxC/day3:$PATH
注意:此种改法只能在当前终端有效
方式2:永久修改---》即:在配置文件:家目录下的隐藏文件----》vim .bashrc / vim ~/.bashrc
在其末尾添加一行命令:export PATH=~/linuxC/day3:$PATH
(6)shell的基本语法
注意:在shell脚本中,没有数据类型的区分,将所有的值都视为一个字符串来处理
变量的分类:
第一类:用户自定义变量
1,如何定义一个变量?
格式: 变量名(一般建议大写)
2,如何给该变量进行赋值?
格式: 变量名=值
3,如何访问该变量的值?
格式: $变量名 / ${变量名}
注意:当$变量名后面紧挨着由字符时,应该注意添加{}来进行分隔,否则会被当成一整个变量名来处理。
eg:
NAME=2
echo This is the $NAMEnd ---->结果为:This is the error!
echo This is the ${NAME}nd --->结果为:This is the 2nd OK!
第二类:位置参数(命令行参数)
理解:和数组类似
意味着该位置参数的下标都是从0开始
但是:下标为0代表当前该可执行文件的名字,从1开始才是每一个有效的参数
引用:
格式:$N (N就是一个常数)
注意:当N >= 10时,应该用{}括起来
eg:
echo ${10}
第三类:系统预定义变量
概念:由系统预先定义好的一些变量,该变量已经被赋予了固定的含义,该变量一般由$和另外一个字母来组成
比如:
$#:代表命令行参数的个数(不包含文件名在内)
$@:代表命令行参数 (不包含文件名在内)
$*:代表命令行参数 (不包含文件名在内)
$?:代表上一条命令的退出状态(正常退出:0,异常退出:1)
第四类:环境变量
查看环境变量----》通过env 命令可以查看所有的环境变量
新增一个环境变量----》export 环境变量名=值
清除一个环境变量----》unset 环境变量名
(7)shell程序和语句
shell程序:由0条或者多条shell命令组成
shell语句:按照规定的shell语法进行书写的文本流、
shell语句的分类:
第一类:说明性语句
第二类:功能性语句
第三类:结构性语句
第一类:说明性语句:以#开头的语句都是说明性语句(除了定格书写的那一行,剩余的都是解释)
第二类:功能性语句:
1,从键盘获取一个变量的值----》read
格式:
read 变量名1 变量名2 变量名3 。。。。 变量名N
所以打印提示语句有两种:
方式1:
echo 语句进行打印体术语句
方式2:
read -p "提示语句" 变量名
2,通配符的转义:
软转义:带双引号即就是软转义,只允许出现特定的shell元字符,以及关闭掉通配符的含义
硬转义:带单引号就是硬转义,即会去掉shell元字符的含义或者通配符的含义
转义字符(以\开头):会去掉shell元字符的含义或者通配符的含义 ---》 \n \t \0 \b
3,算术运算命令:
expr的命令:可以实现算术运算的功能---》加 ,减,乘,除,取余
注意:
(1)使用expr的命令时,运算符前后都应该保留一个空格
(2)当时用*号时,应该使用硬转义或者转义字符\来进行处理
4,测试命令
test :可以测试的对象有三个:字符串,整数,文件属性
测试命令使用形式:
形式1:
test 对象1 对象2
形式2:
[ 对象1 对象2 ]
测试字符串:
假设以str1和str2为例:
str1 = str2 --->测试两个字符串是否相等
str1 != str2 ---》测试两个字符串是否不相等
-z str1 ---》测试str1这个字符串的长度是否为0
-n str2 ---》测试str2这个字符串的长度是否不为0
测试整数:
假设以num1和num2为例:
num1 -eq num2 --->测试两个整数是否相等
num1 -ne num2 --->测试两个整数是否不相等
num1 -gt num2 ---->测试num1是否大于num2
num1 -ge num2 ---->测试num1是否大于等于num2
num1 -lt num2 --->测试num1是否小于num2
num1 -le num2 --->测试num1是否小于等于num2
测试文件属性:
Linux下有7种文件属性,假设以file1和file2为例:
-f file1 ---->测试file1是否存在并且为普通文件
-d file1 ---->测试file1是否存在并且为目录文件
-L file1 --->测试file1是否存在并且为链接文件
-r file1 --->测试file1是否存在并且具有可读权限
-w file1 --->测试file1是否存在并且具有可写权限
-x file1 --->测试file1是否存在并且具有可执行权限
-s file2 ----》测试file2是否存在且长度是否为0
file1 -nt file2 --->测试file1是否比file2更新(按照创建时间或者最新一次修改的时间)
file1 -ot file2 ---->测试file1是否比file2更旧(按照创建时间或者最新一次修改的时间)
第三类:结构性语句(分支语句 && 循环语句)
分支语句:
1.单分支格式:
if 语句块
then
命令表
fi
2.双分支格式:
if 语句块1
then
命令表1
else
命令表2
fi
3.多分支格式:
if 语句块1
then
命令表1
elif 语句块2
then
命令表2
.....
else
命令表N
fi
4.switch_case的脚本格式:
case 常量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
*)
命令表N
esac