Linux Shell 编程基础

什么是shell?

在Linux内核与用户之间的解释器程序

— 通常指/bin/bash(默认解释器)

— 负责向内核翻译及传达用户/程序指令

—相当于操作系统的“外壳”

Image

 

  • 交互式    ——命令行

— 人工干预、智能化程度高;

— 逐条解释执行、效率低;

  • 非交互式 ——脚本

        — 需要提前设计、智能化难度大;

        — 批量执行、效率高;

        — 方便在后台静悄悄地运行;

 

shell就类似于汽车这个概念,那么bash就比喻为具体的品牌型号,比如宝马M2、M3。

/etc/shells 这个文件是保存系统中有多少shell可用

如何切换shell呢?

查看/etc/shells文件里面有多少可用的解释器,直接输入解释器名称即可,比如在命令行直接输入ksh就能切换,如果想返回到bash(默认解释器)直接exit即可。

其他的解释器并没有bash好用,所以红帽官方选择它当做默认的解释器!bash有的特性是其他解释器没有的!

 

 


 

Bash基本特性

— 快捷键、Tab键补全

— 命令历史

— 命令别名

— 标准输入输出

— 重定向

— 管道操作

注意:选项不要过度依赖Tab键(针对于7),个人认为选项能不用Tab就不要用,命令和文件/目录路径可以使用。

 

命令历史:默认记录1000条,通过全局变量HISTSIZE设置;(记录最好改到100以内,每一条命令操作都会有记录,所以任何人都可以看到,所以为了安全起见)

所有用户生效,配置文件:/etc/profile

命令历史使用:!885或者!cat(最近使用cat的记录)可以重复使用之前输入的命令;

清空命令历史:history -c(但是在每个用户的家目录里边还有个文件.bash_history,历史命令已经保存文件中所以要想彻底清空需要把这个文件删除!删除后会自动生成!)

重定向输出/输出

标准输入,描述号为0;

标准输出,描述号为1;

标准错误,描述号为2;

&:错误信息和正确信息

>:覆盖重定向

>>:追加重定向

输出重定向可以理解为本来要显示在屏幕上内容给它放到文件中,那么输入重定向就是本来要通过键盘输入内容直接从文件中去读取,文件的内容代替了键盘输入;

# mail -s dacui root < note.txt

管道

将一条命令的标准输出交由另一条命令处理


脚本的设计

写脚本的三个步骤:

1、脚本声明(需要的解释器、作者信息等)

2、注释信息(步骤、思路、用途、变量含义等)

   #autor:作者、邮箱

   #version:版本

   #Description:描述

3、可执行语句(操作代码)

Linux会按照脚本的上下顺序去执行

执行脚本的方式:

1、chmod +x

2、使用绝对路径来运行

3、bash 运行

4、source 运行

脚本的执行一般都是开启子进程的,但是如果使用source命令执行脚本是不开启子进程的;

source 在当前进程执行

例如,目前有一个脚本名称为a.sh,内容为sleep 100,分别使用bash a.sh    ./a.sh    /root/a.sh    source a.sh执行

使用bash a.sh    ./a.sh    /root/a.sh这三种执行都是一样的,开启子进程

[root@server0 sh]# pstree

bash(当前进程)─── bash(脚本开启的子进程)─── sleep

使用source a.sh结果:

[root@server0 sh]# pstree

bash(当前进程)─── sleep

那么开启子进程和不开启子进程有什么区别吗?

没有太多意义,但是有的时候会需要!比如,修改/etc/profile文件中的HISTSIZE为20条,配置文件修改不能立即生效,需要在新的终端才生效,此时我不想开新的终端那么就使用source命令去执行即可;

未来90%多的脚本都是按照正常执行,不需要考虑到开不开子进程,少数需要考虑到,特殊情况;


变量

 

set 查看所有变量

unset 删除变量

env 查看系统自带的变量

位置变量:

$0:脚本名称

$1:第一个参数

$2:第二个参数

$3:第三个参数

...

$*:列出所有参数

$#:列出参数的个数

$$:显示脚本的PID进程号

$?:查看上一条命令的返回状态,两种值,0和非0

引号

" ":把多个内容变成一个整体;

' ':把多个内容变成一个整体,但是单引号屏蔽特殊符号,也就是说在调用变量的使用单引号就无法调用;

$():取命令的结果;

``:取命令的结果;

tar -czf xx.`date +%F`.tar /var/log

read

只定义变量名

-p:提示

stty -echo  不在终端显示输入信息

stty echo 在终端显示输入信息

export将局部变量变成全局变量

 

猜你喜欢

转载自www.cnblogs.com/BadManWM/p/9975274.html