第01篇_操作系统

第01章_Shell脚本

1. 快速入门

1.1 什么是Shell?

Shell是在Linux内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用Linux内核。

 

1.2 什么是Shell脚本?

Shell脚本就是由Shell命令组成的可执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。

 

1.3 入门案例

一个简单的Shell脚本示例如下:

可以使用./hello.sh(需要x权限). hello.shsource hello.shsh hello.sh命令执行。

 

1.4 脚本调试

Shell 提供了一些用于调试脚本的选项,如:

选项作用
-n读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
-v一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。
-x提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。

这些选项有三种常见的使用方法:

 

 

2. 变量与数据类型

2.1 变量类型

Shell中有三种类型的变量:

 

2.2 定义和使用变量

 

2.3 参数变量

变量含义
$0代表执行的文件名
$n代表传入的第n个参数,如$1
$#参数个数
$*以一个单字符串显示所有向脚本传递的参数
$@与$*相同,但是使用时加引号,并在引号中返回每个参数
$$脚本运行的当前进程号
$!后台运行的最后一个进程的ID
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

 

使用参数时一般需判断参数是否存在(注意$1需要加双引号)。

 

2.4 字符串

 

2.5 数组

 

 

3. 运算符

3.1 算数运算符 + - \* / % == !=

原生的bash并不支持简单的数学运算,通常要通过其它命令来实现。

运算格式
加法expr $a + $b
减法expr $a - $b
乘法expr $a \* $b
除法expr $b / $a
取余expr $b % $a
赋值a=$b
相等[ $a == $b ]
不相等[ $a != $b ]

下面是其它一些可用的运算指令:

注意:

  1. 左括号[也是一个命令,位于/usr/bin/[,在书写命令参数时注意使用空格分开。

 

3.2 关系运算符 -eq -gt -lt

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

运算格式
检测两个数是否相等[ $a -eq $b ]
检测两个数是否不相等[ $a -ne $b ]
检测左边的数是否大于右边的[ $a -gt $b ]
检测左边的数是否小于右边的[ $a -lt $b ]
检测左边的数是否大于等于右边的[ $a -ge $b ]
检测左边的数是否小于等于右边的[ $a -le $b ]

 

3.3 布尔运算符 ! -o -a

运算格式
非运算[ ! false ]
或运算[ $a -lt 20 -o $b -gt 100 ]
与运算[ $a -lt 20 -a $b -gt 100 ]

 

 

3.4 逻辑运算符 && ||

运算格式
逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]]
逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]]

注意:逻辑运算具有特殊的短路功能!

 

 

3.5 字符串运算符 = != -z -n

运算格式
检测两个字符串是否相等[ $a = $b ]
检测两个字符串是否不相等[ $a != $b ]
检测字符串长度是否为0[ -z $a ]
检测字符串长度是否不为 0[ -n $a" ]
检测字符串是否为空[ $a ]

 

3.6 文件测试运算符 -b -s -e

运算shell中的实现
检测文件是否是块设备文件[ -b $file ]
检测文件是否是字符设备文件[ -c $file ]
检测文件是否是目录[ -d $file ]
检测文件是否是普通文件(既不是目录,也不是设备文件)[ -f $file ]
检测文件是否设置了 SGID 位[ -g $file ]
检测文件是否设置了粘着位(Sticky Bit)[ -k $file ]
检测文件是否是有名管道[ -p $file ]
检测文件是否设置了 SUID 位[ -u $file ]
检测文件是否可读[ -r $file ]
检测文件是否可写[ -w $file ]
检测文件是否可执行[ -x $file ]
检测文件是否为空(文件大小是否大于0)[ -s $file ]
检测文件(包括目录)是否存在[ -e $file ]

扩展:文件名通配符

  • *:匹配 0 个或多个任意字符,如:ls /dev/ttyS*。
  • ?:匹配一个任意字符,如:ls ch0?.doc。
  • [若干字符]:匹配方括号中任意一个字符的一次出现,如:ch[012] [0-9].doc。

 

3.7 命令执行符

 

 

4. 控制语句

4.1 if-fi

 

4.2 if-else-fi

 

4.3 if else-if else

 

4.4 for循环

 

4.5 while循环

 

4.6 死循环

 

4.7 until循环

until 循环执行一系列命令直至条件为 true 时停止。

 

4.8 跳出循环

 

4.9 case-esac多选择语句

 

4.10 select-in语句

 

 

5. 函数

5.1 定义和调用函数

注意:

  1. 当函数没有return时,默认返回最后一个命令的运行结果作为返回值。
  2. $10不能返回第十个参数,当n>10的时候,需要使用$(n)来获取参数。
  3. 函数内部的定义的变量在外部也可以访问,可以使用local关键字限制。

 

 

6. 重定向

6.1 重定向简介

一般情况下,每个Linux命令运行时都会打开三个文件:

但有些时候我们可能需要将数据从其它文件读入或读出,这就需要我们重定向。

 

6.2 标准流重定向

 

7. 常用命令

7.1 echo

 

7.2 read

read 命令用于获取键盘输入信息。

 

 

7.3 管道

可以通过 | 把一个命令的输出传递给另一个命令做输入。

第02章_Windows批处理

第一节基础语法

1. 什么是批处理?

批处理是使用批处理文件(Batch File,简称BAT文件)进行批量的命令处理的过程。批处理文件从内容上来看包含了大量的基本DOS命令,是一种可执行文件。批处理文件运行时会按照规则从逐一执行文件中的命令,本质上是一些命令的集合。

 

2. 基础DOS命令介绍

1) 文件与目录相关命令 dir...
命令说明
dir展示路径下的目录和文件信息
cd切换路径。可以用cd ..来切换到上层路径。
盘符:切换盘符。如d:
md创建文件夹
rd删除文件夹
copy复制文件到指定路径
move移动文件到指定路径
ren文件重命名
del删除文件
type查看文件
edit编译文件

 

2) 显示相关命令 echo...
命令说明
title修改cmd窗口标题
prompt修改命令提示符
echo回显。可以使用echo on/off来打开/关闭命令回显。也可以使用@echo作用于单条命令。

 

3) 赋值命令 set
命令说明
set [变量名]查看变量的值。可以省略变量名来查看所有变量。
set [变量名]=[变量值]定义一个字符串类型的变量,并给它赋值。如set var1=abc。注意,=两边最好不要有空格。
set /a [变量名]=[变量值]定义一个数值型变量,并给它赋值。
set /p [变量名]=[提示信息]从标准输入设备获取值,并给予用户提示信息。

 

4) 取值命令 %%
命令说明
%变量名%获取操作系统变量值
%变量名:源串=目的串%读取变量的值做替换后返回,且原变量的值不变。
%变量名:~m,n%读取变量的值截取某一片段返回,且原变量的值不变。

有var=1234567890,有如下:

 

5) 组合命令 & && ||
命令说明
命令1 & 命令2命令1执行完后按顺序执行命令2。
命令1 && 命令2命令1执行完后,如果结果正确,才执行命令2。
命令1 

案例:

 

6) 重定向命令 > >> |
命令说明

>|将命令的输出进行重定向,并覆盖原有内容 >>|将命令的输出进行重定向,但不覆盖原有内容 | |将命令1的输出作为命令2的输入

管道命令还有 < 、<& 和 >& ,它们并不常见,在此暂时不讨论了。

 

7) 调用命令
命令说明
call [标签]用于调用另一个批处理文件,调用完成后继续返回执行。
start [标签]也用于调用另一个批处理文件,特点是会为其新开一个线程,从而不影响原线程执行。

标签的定义以:开头。批处理文件也有一些固定的标签。如:EOF

 

8) 其它命令
命令说明
help [命令]查看命令的帮助信息。命令 /? 也可以达到相同效果
rem注释该行命令
cls清空屏幕显示
color改变命令窗口颜色

 

 

3. 参数传递

1) 输入参数

在命令行执行批处理文件时,可以传递一些参数。如:

那么在批处理中可以通过%参数位置的方式来获取传入的参数。如:%1%2等,值得注意的是,批处理文件最多只能传递9个参数。

test01的文件可以是如下所示:

通常的,批处理文件在头部定义一些变量,来接受外部传入的参数

 

2) 输出参数

输出参数一般不常用,但还是可以了解下它们。请看如下bat文件(num_add.bat):

可以进行一个简单的加法操作,下面是一组用于测试的命令:

 

3) 在call/start时使用参数

有下面一个批处理文件:

goto命令是不可以携带参数的

 

 

第二节 流程控制

1. 条件语句 if-else

1) 基础if-else用法

if-else的基本语法格式如下:

再附加上一个案例,相信你一看就能明白:

变量 TIME 是动态环境变量之一,表示当前时间。 lss 是if命令扩展用法,表示小于的意思。更多信息可以在if/?中获得。

这里有一个小提示,为了防止出现某些意料之外的错误,请勿在if语句进行比较处加一些不必要的空格。

 

2) 延迟变量扩充

这是一个很有意思的特性。下面的例子可以很好的说明直接变量扩充与延迟变量扩充的区别。

setlocal EnableDelayedExpansion 表示开启延迟变量扩充,此时的 !num! 才有意义。

 

3) if exist和if defined

if 还有其他的用法。其中if exist用于判断文件是否存在,就像下面这样:

在对文件进行操作之前进行判断其是否存在很有意义,这使得代码更加健壮。

if defined也与之类似,只不过判断对象不是文件,而是变量,它用于判断环境变量是否被定义。

 

 

2. 循环语句 for-in

for-in大致有三种常用的用法,分别是作用于文件、数字、以及字符串。

1) for-in 之于文件

下面是一个批量修改文件名的批处理文件。

%%i表示迭代变量。值得注意的是,在批处理文件中(而不是命令行),必须使用双%来标识。

 

2) for-in 之于数字

如果想对一系列有规律的数字进行循环,或是在一定的次数内对某个操作进行循环重复的执行,使用 for 也能够实现。下面是一个很好的例子:

/l 是可以跟在 for 后面的重要参数之一。用于标识作用于数字的for-in循环。in中的三个值分为为起始值、步长和结束值。

 

3) for-in 之于字符串

for 也可以对指定范围内的文字进行循。for 后面跟参数 /f ,/f 后面跟选项,所指定的范围 in 里可以是一个文件里的文字,可以是一个字符串,也可以是一条命令的输出结果。我们首先以一个文件里的文字作为循环对象,循环时,每一行将被循环一次。

作为测试,可以在上述批处理文件的同一路径下创建一个用于测试的文本文件 文字筛选.txt ,其内容为:

 

3. 跳转语句 goto call

goto和call可以无条件的改变命令的执行顺序。下面是一个使用goto的案例

call与goto的使用方式类似,但call执行完后依然会回到call之前的位置继续执行剩下的代码,案例可以参考上章节。