shell概念
敲命令->shell【通过bash解释器,解析和翻译用户输入】->系统调用【操作系统内核kernel】->计算机硬件->shell【terminal终端、接受输入,绘制输出】
shell脚本
当命令或者程序语句写在文件中,执行文件,读取其中的代码,这个程序文件就称为shell脚本。
windows中:.bat 批处理脚本
linux中:.sh 脚本
shebang
shebang指的是出现在文本文件第一行前两个字符 #!
在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令。
#! /bin/bash 解释器为bash解释器;
#! /usr/bin/python 解释器为python解释器;
#! /usr/bin/env 解释器名称,是一种在不同平台上都能找到正确解释器的办法。
如果未指定,默认用当前shell解释器。
执行 .sh
- ./hello.sh 【文件需要有x权限】
- source hello.sh
- . hello.sh
- sh < hello.sh
shell和运维
shell监本语言很适合处理纯文本类型数据,且linux的哲学思想就是一切皆文件,如日志、配置文件、文本。网页文件,大多数都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客【grep、sed、awk】。
脚本语言
shell脚本是弱类型语言无需声明变量类型,直接定义使用。【默认都是字符串】
shell特性
- 文件路径tab补全
- 命令补全
- 快捷键 ctrl+ a,e,u,k,l 【l 快速清屏】
- 通配符
- 命令历史
# 历史命令条数
echo $HISTSIZE
# 存放用户执行的历史命令,写入文件
echo $HISTFILE
# history命令
-c 清除历史
-r 恢复历史
# 用历史命令
# !历史id,快速执行
!256
# !!执行上次的命令,以及上下左右寻找
- 命令别名
- 命令行展开
变量
变量定义和赋值,注意变量与值之间不得有空格
name="laomao"
# 单引号不识别特殊符号
# 双引号能识别特殊符号
变量引用
echo ${name}
# 可以省略花括号
变量名规则
- 名称定义见名知意,且按照规则来,不得引用关键字(help检查关键字)
- 只能包含数字、字母、下划线
- 不能以数字开头
- 不能使用标点符号
- 变量名严格区分大小写
变量的作用域
- 本地变量,只针对当前的shell进程。
- 环境变量,也称为全局变量,针对当前的shell以及其任意子进程,都可以找到【分为 自定义、内置 两种】
- 局部变量,针对在shell函数 或是 shell脚本中定义
- 位置参数变量:用于在shell脚本中传递的参数 -l
- 特殊变量:shell内置的特殊功效变量
- $? 【 0 :成功 1-255 :错误码】
- 自定义变量
- 变量赋值: varName=Value
- 变量引用: ${varName}
父子shell
- 每次调用bash、sh解释器执行脚本,都会开启一个子shell,因此不保留当前的shell变量,通过pstree命令检查进程树
- 调用 source 或者 . 是在当前shell环境加载脚本,因此保留变量。
# 在linux中反引号中的命令执行结果会被保留下来
name=`ls`
echo $name
环境变量设置
环境变量:一般指的是用export内置命令导出的变量,用于定义shell的运行环境、保证shell命令的正确执行。
shell通过环境变量确定登录的用户名、path路径、文件系统等各种应用。
环境变了可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如果永久生效,需要修改环境变量配置文件
- 用户个人配置文件 ~/.bash_profile ~/.bashrc 远程登录用户特有文件
- 全局配置文件/etc/profile、 /etc/bashrc,且系统建议最好创建在 /etc/profile.d/ ,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户
检查
每个用户都有自己的环境变量配置文件,~/.bash_profile ~/.bashrc,且以个人配置文件,优先加载变量,读取,以个人的优先生效
当你需要给所有用户都是用某个变量,写入全局即可 /etc/profile
检查系统环境变量的命令
- set 输出所有变量:包括全局变量和局部变量
- env,只显示全局变量
- declare 输出所有的变量,如同set
- export 显示和设置环境变量值
撤销环境变量
- unset 变量名 删除变量或函数
设置只读变量
- readonly,只有shell结束,只读变量失效
系统保留环境变量关键字
bash内嵌了诸多环境变量,用于定义bash的工作环境
export | awk -F ‘[ :=]’ ‘{print $3}’
bash多命令执行
ls /data/;cd /tmp/;cd /home;cd /data
用分号;
环境变量初始化与加载顺序
- ssh登录Linux后,系统启动一个bash shell
bash会读取若干个系统环境文件,检查环境变量设置; - /etc/profile 全局环境变量文件
为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,
并从/etc/profile.d目录的配置文件中搜集shell的设置; - 然后读取/etc/profile.d目录下的脚本
有系统诸多脚本,也放入自定义需要登录加载的脚本,
便于用于登录后立即运行脚本 - 运行$HOME/.bash_profile (用户环境配置文件)
- 运行$HOME/.bashrc
- …
- 运行/etc/bashrc