shell基础
shell概述
1.shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容,Bourne家族主要包括sh、Bash、psh、zsh;C家族包括:csh、tcsh
1 | vi /etc/shells # 查看支持的shell |
脚本执行方式
echo输出命令
1 | echo [选项] [输出内容] |
Bash的基本功能
命令别名和快捷键
1 | alias |
命令生效顺序
- 第一顺位执行用绝对路径或相对路径执行的命令
- 第二顺位执行别名
- 第三顺位执行Bash的内部命令
- 第四顺位执行按照¥PATH环境变量定义的目录查找顺序找到的第一个命令
| 快捷键 | 作用 |
|---|---|
| ctrl + c | 强制终止当前命令 |
| ctrl + l | 清屏 |
| ctrl + a | 光标移动到行首 |
| ctrl + e | 光标移动到行尾 |
| ctrl + u | 从光标所在位置删除到行首 |
| Ctrl + z | 把命令放入后台 |
| Ctrl + r | 在历史命令中搜索 |
历史命令
1 | history [选项] [历史命令保存文件] |
输出重定向
1 | 标准输出重定向 |
输入重定向
1 | wc [选项] [文件名] |
多命令顺序执行
| 多命令执行符 | 格式 | 作用 | ||||
|---|---|---|---|---|---|---|
| : | 命令1:命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 | ||||
| && | 命令1&&命令2 | 逻辑与 当命令1正确执行,命令2才会执行,否则就不会执行 | ||||
| \ | \ | 命令1 \ | \ | 命令2 | 逻辑或 命令1执行不正确,2才会执行,命令1正确,2就不会执行 |
1 | 管道符 |
通配符
| 通配符 | 作用 |
|---|---|
| ? | 匹配一个任意字符 |
| * | 匹配0个或多个任意字符 |
| [] | 匹配括号中任意一个字符 |
| [-] | 匹配括号中任意一个字符如:[a-z] |
| [^] | l逻辑非,表示匹配不是括号中的任意字符 [ ^0-9],表示不匹配数字 |
Bash中其他特殊符号
| 符号 | 作用 |
|---|---|
| ‘ ‘ | 单引号,在单引号中所有特殊符号,如“$ `(反引号) ”都没有特殊含义 |
| “ “ | 双引号,在单引号中所有特殊符号,都没有特殊含义,但“$ `(反引号) 和 \ 是一个例外”都没有特殊含义 |
|
反引号,反引号括起来的是命令系统,在bash中会先执行它,和$()作用一样,不过推荐使用 \$ (),因为反引号容易看错 |
| $() | 和反引号的作用一样 |
| # | # 号代表注释 |
| $ | 用于调用变量值,如$PATH |
| \ | 转意符,跟在\后面的符号将失去特殊含义 |
Bash变量
什么是变量与变量的分类
什么是变量
- 变量是计算机内存的单元,其中存放的值可以改变
- 变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字
变量命名规则
- 变量名必须以字母或下划线开头,名字中间只能由字母、数字和下滑线组成
- 变量长度不得超过255个字符
- 变量名在有效范围之内必须唯一
- 在Bash中,变量的默认类型必须是字符串类型
变量的分类
- 用户自定义变量
- 环境变量
- 位置参数变量
- 预定义变量
用户自定义变量
定义变量
1 | 变量名=变量值 |
变量调用
1 | echo $变量名 |
变量叠加
1 | x=123 |
变量查看
1 | set |
变量删除
1 | unset 变量名 |
环境变量
环境变量与用户自定义变量的区别
- 环境变量是全局变量
- 用户自定义变量是局部变量
设置环境变量
1 | export 变量名=变量值 |
查看环境变量
1 | set |
删除变量
1 | unset 变量名 |
常用环境变量
1 | HOSTNAME 主机名 |
PATH环境变量
1 | PATH变量 系统查找命令的路径 |
PS1环境变量
1 | PS1变量 命令提示符设置 |
当前语系查询
1 | locale |
查询系统默认语系
1 | cat /etc/sysconfig/i18n |
Linux中文支持
前提条件,正确安装的中文字体和中文语系
- 如果有图形界面,可以正确支持中文显示
- 如果使用第三方远程工具,只要语系设定正确,可以支持中文显示
- 如果使用纯字符界面,必须使用第三方插件(如zhcon等)
位置参数变量
| 位置参数变量 | 作用 |
|---|---|
| $n | n为数字,$0代表命令背书,$1-$9代表第一到第九个参数,十以上的需要用大括号包括,如${10} |
| $* | 这个变量代表命令行中所有参数,$*把所有的参数都看做一个整体 |
| $@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
| $# | 这个变量代表命令行中所有参数的个数 |
1 | 例子1: |
预定变量
| 预定义变量 | 作用 |
|---|---|
| $? | 最后一次执行命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行,如果值非0(具体哪个数,由命令自己决定),则证明上一个命令执行不正确 |
| $$ | 当前进程的进程号(PID) |
| $! | 后台运行的最后一个进程的进程号(PID) |
接收键盘输入
1 | read [选项] [变量名] |
运算符
declare命令
1 | declare 声明变量类型 |
声明数组变量
1 | 定义数组 |
声明环境变量
1 | declare -x test=123 |
声明变量只读属性
1 | declare -r test |
查询变量的属性
1 | declare -p |
数值运算的方法
1 | expr和let数值运算工具 |
\$ ((运算式))或 $[运算式]
1 | ff = $(($aa+$bb)) |
运算符
| 优先级 | 运算符 | 说明 | ||
|---|---|---|---|---|
| 13 | -,+ | 单目负,单目正 | ||
| 12 | !,~ | 逻辑非,按位取反或补码 | ||
| 11 | * / % | 乘,除、取模 | ||
| 10 | +,- | 加、减 | ||
| 9 | <<, >> | 按位左移,按位右移 | ||
| 8 | < = ,>= ,< ,> | 小于或等于,大于或等于,大于,小于 | ||
| 7 | == ,!= | 等于,不等于 | ||
| 6 | & | 按位与 | ||
| 5 | ^ | 按位异或 | ||
| 4 | \ | 按位或 | ||
| 3 | && | 逻辑与 | ||
| 2 | \ | \ | 逻辑或 | |
| 1 | =,+=,-=,*=,/=,%=,&=,^=,\ | =,<<=,>>= | 赋值,运算且赋值 |
变量测试
环境变量
配置文件简介
PATH,HISTSIZE,PS1,HOSTNAME等环境变量写入对应的环境变量配置文件
环境变量配置文件中主要是定义系统操作环境生效的系统默认环境变量,如PATH等
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
source命令
1 | source 配置文件 |
配置文件的功能
/etc/profile的作用
- USER变量
- LOGNAME变量
- MAIL变量
- HOSTNAME变量
- HISTSIZE变量
- umask变量
- 调用/etc/profile.d/*.sh文件
其他配置文件
注销时生效的环境变量配置文件
- ~/.bash_logout
其他配置文件
- ~./bash_history
shell登录信息
- 本地终端登录信息 : /etc/issue
| 转义符 | 作用 |
|---|---|
| \d | 显示当前系统日期 |
| \s | 显示操作系统名称 |
| \l | 显示登录终端号,这个比较常用 |
| \m | 先试试硬件体系结构如i386 i686等 |
| \n | 显示主机名 |
| \o | 显示域名 |
| \r | 显示内核版本 |
| \t | 显示当前系统时间 |
| \u | 显示当前登录用户的序列号 |
远程终端欢迎信息
1 | /etc/issue.net |
登录后欢迎信息:/etc/motd
- 不管是本地登录,还是远程登录,都可以显示欢迎信息
正则表达式之字符截取命令
cut字段提取命令
1 | cut [选项] 文件名 |
printf命令
- printf ‘输出类型输出格式’ 输出内容
- 输出类型
- %ns:输出字符串,n是数字代指输出几个字符
- %ni:输出整数,n是数字代指输出几个数字
- %m.nf :输出浮点数,m和n是数字,代指输出的整数位和小数位,如%8.2f代表共输出8位数,其中2位是小数,6位是整数
- 输出格式
- \a:输出警告声音
- \b:输出退格键,也就是backspace键
- \f:清除屏幕
- \n:换行
- \r:回车
- \t:水平输出退格符
- \v:垂直输出退格符
awk命令
1 | awk '条件1{动作1}条件2{动作2}..' 文件名 |
sed命令
1 | sed [选项] '[动作]' 文件名 |
字符处理命令
sort命令
1 | sort [选项] 文件名 |
统计命令wc命令
1 | wc [选项] 文件名 |
条件判断
条件判断式
按照文件类型进行判断
| 测试选项 | 作用 |
|---|---|
| -b 文件 | 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) |
| -c 文件 | 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) |
| -d 文件 | 判断该文件是否存在,并且是否为目录文件(是目录文件为真) |
| -e 文件 | 判断该文件是否存在(存在为真) |
| -f 文件 | 判断该文件是否存在,并且是否为普通文件(是普通文件为真) |
| -L 文件 | 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真) |
| -p 文件 | 判断该文件是否存在,并且是否为管道文件(是管道文件为真) |
| -s 文件 | 判断该文件是否存在,并且是否为非空(非空为真) |
| -S 文件 | 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真) |
1 | 两种判断格式 |
按照文件权限来判断
| 测试选项 | 作用 |
|---|---|
| -r 文件 | 判断该文件是否存在,并且拥有该文件的读权限(有读权限为真) |
| -w 文件 | 判断该文件是否存在,并且拥有该文件的写权限(有写权限为真) |
| -x 文件 | 判断该文件是否存在,并且拥有该文件的执行权限(有执行权限为真) |
| -u 文件 | 判断该文件是否存在,并且拥有该文件的SUID权限(有SUID权限为真) |
| -u 文件 | 判断该文件是否存在,并且拥有该文件的SGID权限(有SGID权限为真) |
| -k 文件 | 判断该文件是否存在,并且拥有该文件的SBit权限(有SBit权限为真) |
两个文件之间进行比较
| 测试选项 | 作用 |
|---|---|
| 文件1 -nt 文件 2 | 判断文件1的修改时间是否比文件2新(如果新则为真) |
| 文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2旧(如果旧则为真) |
| 文件1 -ef 文件2 | 判断文件1是否和文件2的inode号一致,可以理解问是否是同一文件,这个是判断硬链接的一种方式 |
两个整数之间比较
| 测试选项 | 作用 |
|---|---|
| 整数1 -eq 整数2 | 判断整数1是否和整数2相等(相等为真) |
| 整数1 -ne 整数2 | 判断整数1是否和整数2不相等(不相等为真) |
| 整数1 -gt 整数2 | 判断整数1是否大于整数2(大于为真) |
| 整数1 -lt 整数2 | 判断整数1是否小于整数2(小于为真) |
| 整数1 -ge整数2 | 判断整数1是否大于等于整数2(大于等于为真) |
| 整数1 -le整数2 | 判断整数1是否小于等于整数2(小于等于为真) |
字符串的判断
| 测试选项 | 作用 |
|---|---|
| -z 字符串 | 判断字符串是否为空(为空返回真) |
| -n 字符串 | 判断字符串是否为非空(非空返回真) |
| 字符串1 == 字符串2 | 判断字符串1是否和字符串2相等(相等返回真) |
| 字符串1 != 字符串2 | 判断字符串1是否和字符串2不相等(不相等返回真) |
多重条件判断
| 测试选项 | 作用 |
|---|---|
| 判断1 -a 判断2 | 逻辑与 |
| 判断1 -o 判断2 | 逻辑或 |
| ! 判断 | 逻辑非 |
if语句
1 | 单分支if语句格式: |
case语句
1 | case $变量名 in "值1") |
for循环
1 | 语法1 |
while循环和until循环
1 | while [条件] |