Shell—1.开篇基础
Shell本身是命令行解释器,也是一个编程语言 解释性语言
shell种类
cat /etc/shells
/bin/sh # 是bash的一个快捷方式 1和2是一个东西
/bin/bash # bash是大多数linux默认的shell 包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin # 表示非交互 不能登陆操作系统
/bin/dash # 小巧,高效,功能相比少一些
/bin/csh # 具有c语言风格的一种shell 又有许多特性 但也有一些缺陷
/bin/tcsh # 是csh的增强版,完全兼容csh
引用和使用
[root@wg ~]# echo "hello world!" # 单引号双引号都阔以
hello world!
[root@wg ~]# cat /etc/shells # 查看支持哪些shell
/bin/sh
/bin/bash
...
[root@wg ~]# which bash
/usr/bin/bash
- #! 是一个特殊写法,放在shell脚本开头作为标识,表示是shell脚本,不能省略
| #!/bin/bash # 或者 #!/bin/sh ;写成/usr/bin/bash
| #!/bin/env bash # env用于显示系统中已存在环境变量,以及在定义的环境中执行指令
| # env会从用户定义的PATH中寻找bash解释器,移植性更好
| #!/bin/env python # 引用python,这时候是python脚本
- 养成写注释的良好习惯,最好分段也写,shell用 # 注释
| #!/usr/bash
| #Author: $author
| #Created Time: $date
| #name:first.sh
| #desc:描述
| #path:/tmp/tuzi
| #usage:用法
- cat -A xx.sh # 查看shell脚本的全部内容,含隐藏内容!
- dos2unix xx.sh # 把windows下编辑的脚本改成linux下的
- unix2dos # 相反的命令
- 调用脚本的三种方式:
| ./xx.sh
| 绝对路径文件名
| bash xx.sh # 不用赋权限
- 脚本的标准执行方式 要有执行权限
- 非标准的执行方式,直接在命令行指定解释器执行或source
| bash -x xx.sh # 查看脚本的源代码(执行过程)一般用于排错
| bash -n xx.sh # 查看脚本语法是否有问题
| source xx.sh # 重新读取脚本
| 查看执行过程,使用source命令读取脚本文件,都不需要执行权限
echo "$(date '+%F %T')"
特殊符号
- ~ 家目录 # cd ~ 返回家目录
- ! 执行历史命令 # !! 执行上一条命令
- $ 变量中内容
- & 后台执行
- * shell的通配符,匹配所有
- ? 匹配除回车以外的一个字符
- ; 在shell中表示一行执行多个命令,命令之间用分号分割。
- | 管道
- \ 转义
- `` 反引号 命令中 执行命令 echo "today is `date +%F`"
- '' 单引号 脚本中字符串要用单引号引起来,但是单引号不能解释变量
- "" 双引号 脚本中出现的字符串可以用双引号引起来
--- 部分符号输出结果对比 ---
[root@wg ~]# echo date +%F
date +%F
[root@wg ~]# echo 'date +%F'
date +%F
[root@wg ~]# echo "date +%F"
date +%F
[root@wg ~]# echo $'date +%F'
date +%F
[root@wg ~]# echo $"date +%F"
date +%F
[root@wg ~]# echo `date +%F`
2012-12-12
[root@wg ~]# echo $(date +%F)
2012-12-12
[root@wg ~]# echo ;date +%F // 这里其实换行了 应该写 echo -n;date +%F
2012-12-12
通配符
- 通配符跟特殊符号有重复的地方,放在一起整理下
- ? 匹配一个任意字符
- * 匹配0个或任意多个字符 也就是可以匹配任何内容
- [] 匹配中括号中任意一个字符
- [-] 匹配汇总括号中任意一个字符 -代表一个范围
- [^] 逻辑非 代表匹配不是中括号内的一个字符
- () 在子shell中执行
| (cd /opt;ls) // 仅查询 opt 目录,自己环境未变化
- {} 集合 touch file{1..9} // 创建file1到9文件
- \ 转义符
常用快捷键
ctrl+a 把光标移动到命令行首
ctrl+e 把光标移动到命令行尾 这两个是在修改语句的时候使用
ctrl+u 删除或剪切贯标之前的内容
ctrl+k 删除或剪切光标之后的内容
ctrl+y 粘贴u或k的内容
ctrl+r 在历史命令中搜索 按下后悔出现搜索界面
ctrl+l 清屏
ctrl+c 强制终止当前命令
ctrl+d 退出当前终端
ctrl+z 暂停当前进程,放入后台
ctrl+s 暂停屏幕输出
ctrl+q 恢复屏幕输出
运算符
1、逻辑运算符
- ; 命令1;命令2; 多个命令顺序执行,命令之间没有任何逻辑关系
- && 逻辑与的关系 命令1正确执行 命令2才会执行
- || 逻辑或的关系 命令1执行不正确 命令2才会执行 反之同样~
- dd if=输入文件 of=输出文件 bs=字节数 count=个数
| if 指定源文件或源设备
| of 指定目标文件或目标设备
| bs 指定一次输入/输出多少字节 即把这些字节看做一个数据块
| count 指定输入输出多少个数据块
2、运算符使用
- declare声明变量类型
| declare 【+/-】【选项】变量名
| 减号 给变量设定类型属性
| 加号 取消变量的类型属性
| -i 将变量声明为整数型
| -x 将变量声明为环境变量
| -p 显示指定变量的被声明的类型
- 数值运算方法
| declare -i cc=$aa+$bb 先给aa,bb赋值再执行
- 运算方法2 用expr或let运算工具
| dd = $(expr $aa + $bb) 运算符两侧空格不能省略
- 运算方法3 $((运算式)) 或 $[运算式]
| ee=$(($aa+$bb)) ff=$[$aa+$bb]
- 支持的运算符 数值越高优先级越高
四则运算
- 方式一: let
| let sum=2+3;echo $sum
| i=4;let i++;echo $i
| n=1;let n=n+1;echo $n
- 方式二: expr
| expr 1 + 1 运算符号前后必须空格
| * 需要反斜杠转义
| 只有expr不能求幂
| expr $num1 + $num2
- 方式三: bc程序
| echo 1+1.5|bc
|
| bc 命令可以直接进入程序,在里边进行运算
- 方式四: $(())
| echo $(($num1+$num2))
| echo $((num1+num2))
| sum=$((1+2));echo $sum
- 方式五: $[]
| echo $[5+2]
- i++ 先赋值,再运算
- ++i 先运算,再赋值
Bash基本功能
1、history
- 查看历史命令;退出重启后才能看到新输入的命令
- history 【选项】【历史命令文件】
- -c 清空历史命令
- -w 把历史命令写入历史命令保存文件
- 历史命令文件保存在家目录下 .bash_history
- 默认保存1000条历史命令,可在配置文件中修改
- 配置文件保存在 /etc/profile
- !字符串 !! !数字 三种方式
2、alias
- alias 别名="原命令" // 一定要加引号
- 写入 /root/.bashrc 让别名永久生效
- unalias 删除别名
3、标准输入输出
- 键盘 /dev/stdin 0 输入
- 显示器 /dev/stdout 1 输出
- 显示器 /dev/sdterr 2 错误输出
4、管道符
- 命令格式 命令1|命令2 命令1的正确输出作为命令2的操作执行
- grep 【选项】 '搜索内容'/文件名
| -i 忽略大小写
| -n 输出行号
| -v 反向查找
| --color=auto 把搜索出的关键字用颜色显示
- tee 三通管道符
输入输出重定向
- 命令 > 文件 以覆盖的方式 把命令的正确输出,输出到指定的文件或设备当中。
- 命令 >> 文件 以追加的方式,把命令的正确输出,输出到指定的文件或设备当中。
- 命令 2> 文件 以覆盖的方式 把命令的错误输出。。。。
- 命令 2>> 文件 以追加的方式 把命令的错误输出。。。
- 命令 > 文件 2>&1 以覆盖方式 把正确和错误都保存到一个文件
- 命令 >> 文件 2>&1 以追加的方式 把正确和错误都保存到一个文件
- 命令 &> 文件 以覆盖方式 把正确和错误。。。
- 命令 &>> 文件 以追加的方式 把正确输出和错误输出都保存到一个文件当中
- 命令 >>文件1 2>>文件2 把正确的追加到文件1 把错误的追加到文件2
- 命令 &>/dev/null 相当于执行结果都放进垃圾箱
- wc 【选项】【文件名】 命令<文件
| -c 统计字节数
| -w 统计单词数
| -l 统计行数
前后台作业控制
- &
- nohup
- ^C
- ^Z // 把作业隐藏到后台
- bg
- fg // 把作业调回来
- kill
- screen
# 在前台结束进程
Control+C
# 在前台暂停进程
Control+Z
# 查看后台执行的进程 查看进程号码
jobs
# 运行命令时,在命令末尾加上&可让命令在后台执行
&
# 将命令进程号码为N的命令进程放到前台执行
fg processNum
# 或者
%processNum
# 将命令进程号码为N的命令进程放到后台执行
bg processNum
颜色设置
echo -e "\e[1;33mthis is a red text.\e[0m"
- 3开头前景色
- 4开头背景色
知识体系
- 变量
| 自定义变量
| 系统环境变量
| 预定义变量
| 位置参数变量
| 内置变量
- 条件判断
- 循环语句
- 流程控制
- 函数 function
- 数组 array
- 正则表达式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律