目录
- 0.前置知识
- 1.Shebang
- 2.Linux特殊符号整理
- 3.变量
- 4.环境变量
- 5.父子shell
- 0.概念
- 1.创建进程列表(创建子shell执行命令)
- 6.内置命令 vs 外置命令
0.前置知识
#
用于注释- shell脚本语⾔属于⼀种弱类型语⾔:⽆需声明变量类型,直接定义使⽤
- shell三剑客:
grep、sed、awk
- shell编程,尽量⽤内置系统操作,与内置函数
1.Shebang
- 计算机程序中,Shebang指的是出现在⽂本⽂件的第⼀⾏前两个字符
#!
- 在Unix系统中,程序会分析Shebang后⾯的内容,作为解释器的指令,例如:
- 以
#!/bin/sh
开头的⽂件,程序在执⾏的时候会调⽤/bin/sh
,也就是bash解释器 - 以
#!/usr/bin/python
开头的⽂件,代表指定Python解释器去执⾏ - 以
#!/usr/bin/env
解释器名称,是⼀种在不同平台上都能正确找到解释器的办法
- 以
- 注意事项
- 如果脚本未指定Shebang ,脚本执⾏的时候,默认⽤当前shell去解释脚本,即
$SHELL
- 如果Shebang指定了可执⾏的解释器,如
/bin/bash /usr/bin/python
,脚本在执⾏时,⽂件名会作为参数传递给解释器 - 如果
#!
指定的解释程序没有可执⾏权限,则会报错“bad interpreter: Permission denied” - 如果
#!
指定的解释程序不是⼀个可执⾏⽂件,那么指定的解释程序会被忽略,转⽽交给当前的SHELL去执⾏这个脚本 - 如果
#!
指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory” #!
之后的解释程序,需要写其绝对路径(如:#!/bin/bash
),它是不会⾃动到$PATH
中寻找解释器的- 如果使⽤
bash test.sh
这样的命令来执⾏脚本,那么#!
这⼀⾏将会被忽略掉,解释器当然是⽤命令⾏
- 如果脚本未指定Shebang ,脚本执⾏的时候,默认⽤当前shell去解释脚本,即
2.Linux特殊符号整理
${vars}
:取值变量的值$()
:在括号中执行命令,且拿到命令的执行结果- ` `:在括号中执行命令,且拿到命令的执行结果
()
:开启子shell执行命令结果$vars
:取出变量值
3.变量
-
变量定义与赋值,注意变量与值之间不得有空格
- 变量类型:bash默认把所有变量都认为是字符串
- bash变量是弱类型,无需事先声明变量类型,声明和赋值同时进行
name="SnowK"
-
变量替换/引用
name="SnowK" echo ${name} echo $name # {}可以省略
-
变量名规则
- 名称定义要做到⻅名知意,切按照规则来,切不得引⽤保留关键字
- 只能包含数字、字⺟、下划线
- 不能以数字开头
- 不能⽤标点符号
- 变量名严格区分⼤⼩写
-
变量的作用域
- 本地变量:只针对当前的shell进程
- 环境变量:也称为全局变量,针对当前shell以及其任意子进程
- 环境变量也分自定义、内置两种环境变量
- 局部变量:针对在shell函数或是shell脚本中定义
-
位置参数变量:用于shell脚本中传递的参数
- 例如:
ls -l
,中的-l
就是位置参数变量
- 例如:
-
特殊变量:shell内置的特殊功能变量
$?
- 0:成功
- 1~255:错误码
-
自定义变量
- 变量赋值:
varName=value
- 变量引用:
${varName}、$varName
- 单引号变量,不识别特殊语法
- 双引号变量,能识别特殊语法
- 变量赋值:
-
不同的执行方式,不同的shell环境
- 每次调⽤bash都会开启⼀个⼦shell,因此不保留当前的shell变量
- 调⽤source或者
.
符号,是在当前shell环境加载脚本,因此保留变量
-
在Linux中,反引号中的命令的执行结果会被保留下来(存进对应的变量中)
4.环境变量
- 环境变量:⼀般指的是⽤
export
内置命令导出的变量,⽤于定义shell的运⾏环境、保证shell命令的正确执⾏- shell通过环境变量确定登录的⽤户名、PATH路径、⽂件系统等各种应⽤
- 环境变量可以在命令⾏中临时创建,但是⽤户退出shell终端,变量即丢失,如要永久⽣效,需要修改环境变量配置⽂件
- 用户个人配置文件:
~/.bash_profile
~/.bashrc
:远程登陆用户特有文件
- 全局配置文件:修改全局配置文件,影响所有登陆系统的用户
/etc/profile
/etc/bashrc
- 系统建议最好创建在
/etc/profile.d/
,而非直接修改主文件
- 以个人配置文件,优先加载、读取、生效
- 用户个人配置文件:
- 检查系统环境变量的命令
set
:输出所有变量,包括全局变量、局部变量env
:只显示出全局变量declare
:输出所有的变量,如同set
export
:显示和设置环境变量值
- 撤销环境变量:
unset 变量名
:删除变量或函数 - 设置只读变量:
readonly
:只有shell结束,只读变量才失效 - 环境变量初始化与加载顺序
5.父子shell
0.概念
-
父子shell
-
source
和.
,执行脚本,只在当前的shell环境中执行生效 -
指定bash sh解释器运行脚本,是开启subshell,开启子shell运行脚本命令
-
./script
,都会指定Shebang,通过解释器运行,也是开启subshell运行命令
-
-
子shell
-
多个子shell
1.创建进程列表(创建子shell执行命令)
- 为什么学习子shell?意义在哪里?
- 为了某个指令不卡住当前shell,开启子shell以达到异步的目的
- 实现多进程的处理,提高程序并发执行效率
- 进程列表:加上
()
,开启子shell运行命令,并且子shell是可以嵌套运行的(cd ~; pwd; ls; cd /tmp; pwd; ls) (pwd; (echo $BASH_SUBSHELL))
- 检测是否在子shell环境中:
BASH_SUBSHELL
:该变量的值特点- 如果是0,就是在当前shell环境中执行的
- 否则就是开辟子shell去运行的
- 示例:
- 检测是否开启了子shell运行命令:
cd ~; pwd; ls; cd /tmp; pwd; ls; echo $BASH_SUBSHELL
- 明确开启子shell运行的命令:
(cd ~; pwd; ls; cd /tmp; pwd; ls; echo $BASH_SUBSHELL)
- 检测是否开启了子shell运行命令:
6.内置命令 vs 外置命令
- 什么是内置命令,什么是外置命令?
- 内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源
- 内置命令和shell是为一体的,是shell的一部分,不需要单独去读取某个文件,系统启动后,就执行在内存中了
- 特点:不会产生子进程去执行
- 外置命令:系统需要从硬盘中读取程序文件,再读入内存加载
- 自己单独下载的文件系统命令,处于bash shell之外的程序
- 特点:一定会开启子进程执行
- 内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源