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

一.什么是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

猜你喜欢

转载自blog.51cto.com/14469918/2440256
今日推荐