一.什么是shell?

在linux内核与用户直接的解释器程序; 通常指/bin/bash; 相当于操作系统的“外壳”。

二.怎么使用shell? shell的使用方式?

1. 命令行 ==交互式; 逐条解释执行,效率低

2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。

三.怎么切换shell ?怎么使用某个特定shell?

1. 通过usermod , chsh 更改登录的shell

2. 手动执行目标shell程序

/bin/sh ?//多数unix默认使用的shell ?  ?/bin/bash ? //多数Linux默认使用的shell

四.交互式硬件设备


标准输入: 从该设备接收用户输入的数据

标准输出: 通过该设备向用户输出数据

标准错误: 通过该设备报告执行中的出错信息

SHELL 超详细基础知识,适合新手小白(一)
重定向操作: 改变标准输入/输出/错误输出的方向。
SHELL 超详细基础知识,适合新手小白(一)

五.什么是shell脚本?

写好的执行语句,能够完成特定任务的文件

创建脚步的步骤? 脚本创建三步走

1.创建文本文件;
2.添加可执行的脚步语句
3.添加x 执行权限。

六.脚本构成? 规范的脚步构成?

1. ?#!//脚本声明(使用哪种解释器)

2. # ?//注释信息(步骤, 思路,用途,变量含义等)

3. 可执行语句

七.脚本怎么执行? 脚本执行有哪几种方式?


1. 作为命令 /命令字; 指定脚本文件的路径,前提是有x 权限

2. 作为“参数”; 不要求有 x 权限

sh ?脚本路径

source 脚本文件路径

 . 脚本文件路径

 ./脚本文件路径

八.shell脚本怎么调试?

1.直接观察执行中的输出,报错信息
2.通过 sh -x 开启调试模式
3.在可能出错地方设置 echo 断点

九.Shell变量

1.变量的设置和取消

定义赋值变量: 变量名=变量值;

注意事项:

1. 等号两边不要有空格

2. 若指定的变量名已存在,相当于为此变量重新赋值

3. 变量名由字母/数字/下划线组成,区分大小写;不能以数字开头

2.查看变量

应用变量值 : $变量名

查看变量值: echo $变量名, ?echo ${变量名} ? ? //变量名易混淆时,以{}界定; ?未定义的变量取不到值

echo $var16.5, ${var1}6.5

取消变量

手动取消: unset 变量名。。如:

unset X

退出shell环境时,变量会自动失效。

十.Shell变量的分类??

1.储存类型:

整数型, 浮点型,双精度浮点型, 字符型

2.使用类型:

环境变量: 通常都是大写,有系统维护,只有个别变量,用户可以直接更改

预定义变量: 位置变量: bash内置,存储执行脚本时提供的参数

预定义变量: bash内置,可直接调用,但不能直接赋值或修改

自定义变量: 由用户自主设置,修改及使用

?

环境变量:

1. 配置文件: ?/etc/profile ? ; ? ? ~/.bash_profile

2. 相关操作; ?

env ? //列出所有的环境变量

set ? //列出所有变量

3. 常见的环境变量

PWD, PATH , USER, LOGNAME, UID , SHELL, HOME, PS1, PS2

预定义变量:

$0 ?//当前所在的进程名或 脚本名

$$ ?//当前进程的PID号

$? //命令执行后的返回状态, 0表示正常, 1或其他值表示异常。

$# //已加载的位置变量的个数

$* //所有位置变量的值

位置变量 :

$n 或${n}? //n为序号,在执行脚本时提供的命令后参数。

?``

扩展赋值操作

有哪三种定界符?它们的区别是什么?

1. 双引号 "" : 允许扩展,以 $ 引用其他变量

2. 单引号 '' : 禁用扩展, 即便$也视为普通字符

3. 反撇号 `` ?相当于$()?: 将命令的执行输出作为值;但是$()更方便嵌套使用。

?

十一.怎么读取标准输入值? read 可以从标准输入中 读取值

read 从键盘读入变量 并完成赋值

格式: read ?[-p "提示信息"] ?变量名 ?//注意要有空格

-p可选, -t可指定超时秒数

?

十二.变量的作用范围? 变量的作用域

1.局部变量

新定义的变量默认只能在当前Shell环境中有效;无法在子Shell环境中使用。

2. 全局变量

在当前Shell及子Shell环境中均有效

怎么定义全局变量: 使用export 可将局部变量声明为全局变量

export 局部变量名[=变量名] ?//为局部变量添加全局属性

export -n 全局变量名.... ? ? ? //取消指定变量的全局属性

十三.数值运算:

整数运算:

+ - * / ? %

1. ?expr 运算工具

格式: expr 整数1 ?运算符 ?整数2; //注意运算符两侧要有空格

+ ?- ? \* ? / ?% ? ? ? ? ? ?//注意乘法要转义,避免被作为Shell通配符

2. ?使用 $[] ?或 $(()) 表达式

相比expr更方便简便实用:

1.乘法操作 * 无需转义,

2.运算符两侧可以无空格;

3. 应用变量可以省略 $符号;

3.变量怎么 自增 或自减?

使用 $[] ?或者 let 命令

echo $[i+=2]

let i++; echo $i

小数的运算

注意: Bash内建机制仅支持整数值运算; expr ; $[] 算式替换不支持小数的运算。

bc //多数Linux 默认安装此工具

quit 退出 ; scale=n 指定小数位数;

bc 的使用; 结合管道向bc发送表达式; ?多个表达式分号分隔

echo "scale=4; $A*56.789;5/3" | bc

小数值的比较

基本用法:

echo "数值1 比较符 数值2" ?| bc

如果表达式成立,则返回的计算结果为1, 否则返回0

常见比较操作 > ?>= ?< ?<= ?== !=

A=12.34; B=56.78

echo "$A<=$B" | bc

十四.条件测试

test 测试操作

格式: test ?选项 参数

或 [ ?选项 参数 ] ; //注意要有空格

十五.文件状态测试

[ 操作符 文件或目录 ]

SHELL 超详细基础知识,适合新手小白(一)

十六.整数值比较

[ 整数值1 操作符 整数值2?]

SHELL 超详细基础知识,适合新手小白(一)

十七.字符串比较

[字符串1 操作符 字符串2]

SHELL 超详细基础知识,适合新手小白(一)

[操作符 字符串]
SHELL 超详细基础知识,适合新手小白(一)

十八.组合多个条件

逻辑分隔操作

用法:

命令1 操作符 命令2

[条件1] 操作符 [条件2]

&&  给定条件必须都成立,整个测试结果才为真
||  只要其中一个条件成立,则整个测试结果为真
!   取反符号

十九.if 选择结构

单分支结构

if ?条件测试

? ? then ?命令序列

fi

双分支结构

if ?条件测试

then ?命令序列1

else 命令序列2

fi

多分支结构

if 条件测试1

? ? ? ?then 命令序列1

elif 条件测试2

? ? ? ?then 命令序列2

else 命令序列n

fi

二十.循环结构

for循环

for 变量名 ?in ?值列表

do

? ?命令序列

done

条件式循环

while 条件测试

do

? ? ?命令序列

done

until循环

当条件不成立时,循环执行语句序列

until 条件测试

do

? ? ?命令序列

done

case 分支结构

case 变量值 in

模式1)

? ? 命令序列1 ;;

模式2)

? ? 命令序列2;;

.....

*)

默认命令序列

esac

二十一.函数及中断控制

如何定义函数?

function 函数名{

? ? ? 命令序列

}

函数名(){

? ? ? 命令序列

}

怎么调用函数?

函数名 ? 值1 ?值2 ?.. ..

中断,退出及相关指令:

break ; ?跳出当前所在的循环体,

continue ; 跳过循环体内余下的语句,重新判断条件以判断是否需要执行下一次循环

exit; ? 退出脚本,默认的返回值是 0

shift ; 用来迁移位置变量,每执行一次,结果如下:丢弃$1,原来的$2 变为$1.

?

二十二.shell数组

变量的类型

变量的值默认均为文本

强制声明类型

格式 : declare ?选项 ?变量名

常见选项

-i ? //强制为整数

-a ?//定义为数组

-x ?//设置为全局变量

-r ?//设置为只读

定义/赋值数组

方法一, 整体赋值:

格式: 数组名=(值1 值2 .. .. 值n)

方法二,单个元素赋值

格式: 数组名[下标]=值 ? ? ? ? //下标从0开始

输出数组元素

${数组名[下标]} ? //获取单个数组元素

${数组名[@]} ? ? ? //获取所有数组元素

${#数组名[@]} ? ? //获取数组元素的个数

${数组名[@]:起始下标:元素个数} ? ? ? ?//获取连续的多个数组元素

${#数组名[下标]} ? ? ? //获取某个数组元素的长度

${数组名[下标]:起始下标:字符数} ? ?//截取数组元素值的一部分

二十三.expect 简介

可以在shell脚本中,为交互式过程自动输送预先准备的文本或指令,而无需人工干预;触发的依据是预期会出现的特征提示文本。

正则

egrep 过滤工具 ? ? ? ? ? //相当于grep -E

以行为单位,逐行进行处理; 默认只输出与表达式匹配的文本行

基本用法:

格式1 : egrep [选项] ‘正则表达式' 文件 .. ..

格式2: ?前置命令 | egrep [选项] ?‘正则表达式

常用的命令选项

-i ?//忽略字母大小写

-v ? //条件取反

-c ?//统计匹配的行数

-q ?//静默,无任何输出, 一般用于检测 //看$? 返回值 如果为0,说明有匹配,否则无匹配

-n ?//显示出匹配结果所在的行号

--color ? //标红显示匹配字串

基本元字符

SHELL 超详细基础知识,适合新手小白(一)

二十四.sed工具

1.Stream EDitor 流式编辑器; 非交互,基于模式匹配过滤及修改文本; 逐行处理,并将结果输出到屏幕;

2.可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作。

格式

格式1 : 前置命令 | sed ?[选项] ?‘编辑指令'

格式2: ? ?sed ?[选项] ? '编辑指令' ?文件 .. ..

常见命令选项

-n ? //屏蔽默认输出(全部文本);按条件输出

-i ?//直接修改文件内容

-f ? //使用sed脚本

-e ? //可指定多个处理动作

-r ? //启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项

{} ?//可组合多个命令,以分号分隔

定址符, 即[地址1[,地址2]] ? //用来指定处理的起,止行数;省略定址符时,默认逐行处理全部文本

基本的处理动作

SHELL 超详细基础知识,适合新手小白(一)

常见的处理操作示例

SHELL 超详细基础知识,适合新手小白(一)

SHELL 超详细基础知识,适合新手小白(一)

二十五.使用 sed脚本

复杂操作可存为脚本,通过-f调用

格式: sed -f 操作脚本 ?文件 .. ..

sed文本块处理

应用场景?能做什么?

如何在文本内插入新行?

如何插入多行文本?

如何替换掉指定的整行文本?

SHELL 超详细基础知识,适合新手小白(一)

处理多行文本

修改后的文本有多行时? 我想插入多行怎么做?

以换行符\n 分隔

或者 使用\ 强制换行

#sed -n '2cXX\nYY' ?m.txt

sed 高级应用

文件导入导出

SHELL 超详细基础知识,适合新手小白(一)

注意: -r动作应结合-i选项才会存入,否则只能输出

sed '2r m.txt' reg.txt

sed -n '/^XX/w d.txt' ?reg.txt

sed 复制剪切

模式空间:

存放当前处理的行,将结果输出;若当前行不符合处理条件,则原样输出;处理完当前行再读入下一行来处理。

保持空间:

作用类似于 “剪贴板”; 默认存放一个空行(换行符\n)

基本动作

-H ?: 模式空间 --[追加]--> 保持空间 ?//复制

-h : 模式空间 --[覆盖] -->保持空间 ? //复制

-G : 保持空间--[追加]--> 模式空间 ? ?//粘贴

-g : 保存空间--[覆盖] -->模式空间 ? ? //粘贴

例子:

sed '1,3H;$G' reg.txt ? ? //把第1-3行复制到文件末尾

sed '1h;2,3H;$G' reg.txt //可避免出现空行

sed '1h;1d;$G' reg.txt ?//把第1行剪切到文件末尾

sed '1h;2H;1,2d;$G' reg.txt ?//把第1-2行剪切到文件末尾

?

sed 流程控制

! ? 取反操作; 根据定址条件取反

sed -n '/bash$/!p' ?/etc/passwd

n ?读下一行 ; 产生隔行/跳行的效果

sed -n 'p;n' reg.txt ?//输出奇数行

sed -n 'n;p' reg.txt //输出偶数行

?

?

二十六.awk工具概述

awk编程语言/数据处理引擎

创造者: Aho, Weinberger, ?kernighan

基于模式匹配检查输入文本,逐行处理并输出;通常用在shell脚本中,获取指定数据;单独用时,可对文本数据做统计。

用法:

格式1 : 前置命令 | awk [选项] ?'[条件]{编辑指令}' ? ? ?//多条语句可以分号分隔; print 是最常用的指令

格式2: ? awk ?[选项] ?'?[条件]{编辑指令}' 文件.. .. ? //注意:awk条件和指令需要使用单引号

常用命令选项

-F : 指定分隔符,可省略(默认空格或Tab位)

-f : 调用awk脚本进行处理

-v : 调用外部Shell变量

awk内置变量

有特殊含义,可直接使用

SHELL 超详细基础知识,适合新手小白(一)

awk '{print "第"FNR"行","有"NF"列"}' ?m.txt

awk '{print "Last:"$NF}' m.txt ? ? ?//输出每行最后一个字段

awk -F: '$1==ENVIRON["USER"]{print $3}' ?/etc/passwd ? ? ? ?//输出当前用户的UID信息

二十七.条件的表现形式?

正则表达式

数值/字符串比较

逻辑比较

运算符

正则表达式: ?/正则表达式/

~匹配 ? ? !~ 不匹配

awk -F: '/^ro/{print}' ?/etc/passwd ? ?//列出以ro开头的用户记录

awk -F: '$7!~/bash$/{print $1,$7}' ?/etc/passwd ? ?//列出第7个字段不以bash结尾的用户名,登录shell

数值比较

== 等于 ? != 不等于

> 大于 ?>= 大于或等于

< 小于 ? <= 小于或等于

awk 'NR==2{print}' reg.txt ? ?//输出第2行文本

awk '$2!="XX"{print}' reg.txt ? //输出第2列不是XX的行

awk 'NF>=2{print}' reg.txt ? ? ? //输出包含2个及以上字段的行

逻辑比较测试

&& ?逻辑与 ?: 期望多个条件都成立

|| ?逻辑或 : 只要有一个条件成立即满足要求

awk -F: '$3==1 || $3==7{print $1,$3}' ? /etc/passwd ? ?//列出UID为1或7的用户信息

运算符

+ - * ?/ %

++ ? -- ? += ? -= ?*= ?/=

seq 200 ?| awk 'BEGIN{i=0}($0%3==0)&&($0%13==0){i++}END{print i}' ? //计算同时被3和13整除的整数个数

二十八.流程控制-分支结构

单分支: ?if(条件){编辑指令}

双分支: if(条件){编辑指令1}else{编辑指令2}

多分支: if(条件){编辑指令1}else if(条件){编辑指令2} .. .. else{编辑指令N}

awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' ?/etc/passwd ? ?//统计UID小于或等于500的用户个数;统计UID大于500的用户个数。

二十九.流程控制- 循环结构

while循环

while(条件){编辑指令}

do while循环

do{编辑指令}while(条件)

#awk -F [:/] '{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' ?/etc/passwd ? ?//统计/etc/passwd文件内“root”出现的次数

for循环

for(初值;条件;步长){编辑指令}

其他控制语句- 常用的中断,退出等awk指令

SHELL 超详细基础知识,适合新手小白(一)

三十.数组的定义及使用

定义数组:

格式: 数组名[下标]=元素值

调用: 数组名[下标]

遍历数组:

用法: for(变量 in 数组名){print 数组名[变量]}

#awk -F: '!a[$7]++{print $7}' ?/etc/passwd

命令sort :?

-n ? //按数字升序排列

-k //针对指定的字段进行排序

-r ?//反向排序

 /var/access_log ?| sort -nr ?-k2