sudo -i #进入 root 交互环境 退出交互环境的方法:exit 或 logout 或 快捷键 Ctrl + D
标准输出输出与管道、重定向操作
1. 管道符号
- 管道符号:|
- 作用:将前一个命令的输出作为后一个命令的输入
- 限制:默认仅传递正确输出(错误输出stderr需额外处理)
2. wc命令的统计功能
wc 用于统计输入内容的行数、单词数、字节数等:
- 常用选项:
-l:统计行数(如日志文件行数)。-w:统计单词数(以空格/换行符分隔)。-c:统计字节数(文件大小)。-m:统计字符数(适用于多字节编码如UTF-8)。-L:显示最长行的字符数。
- 基础语法:
wc [选项] [文件] # 直接处理文件 命令 | wc [选项] # 通过管道处理输入
3. 管道用于筛选
- grep:用于文本搜索和筛选,支持正则表达式。
- 常用选项:
-i:忽略大小写。-v:反向匹配(显示不匹配的行)。-n:显示行号。-r或-R:递归搜索目录。
- 基础语法:
grep [选项] '模式' [文件] 命令 | grep [选项] '模式'
- 常用选项:
4. 用tee保存管道的中间结果
- tee:将标准输出作为标准出入保存到目标文件
seq 100 | grep 7 | tee result.txt | wc -c
5. 重定向
- 重定向标准输出
seq 100 > seq100.txt
cat seq100.txt | head
- 重定向标准输入
wc -l < s100.txt
6. 自由管道 FIFO named pipe
- FIFO(First In, First Out,先进先出),也称为命名管道(Named Pipe),是一种特殊的文件类型,用于进程间通信(IPC, Interprocess Communication)
- 注意文件系统限制
- 切换到支持 FIFO 的本地文件系统(如 /tmp 或用户主目录)
mkfifo filter.pipe
seq 100 > filter.pipe &
grep 7 < filter.pipe
7. 任务控制
jobs查看后台任务&表示运行于后台fg将任务放到前台bg将任务放到后台kill杀死任务Ctrl + C终止前台任务Ctrl + Z暂停前台任务
命令巡礼
1. 本机信息
uname -a查看系统信息hostname查看主机名date查看日期id查看用户信息uptime查看系统运行时间
2. 日常操作
- 创建文件:
touch file1 file2
ls -l file1 file2
3. cut选择列
sudo dmesg | cut -c-15 | tail -n 10
文件信息
find dir -name "*.txt":查找指定目录下的所有 .txt 文件- 识别文件类型
file filename
通配符
*:匹配任意字符(0个或多个)?:匹配单个字符(0个或1个)
脚本
- 让脚本可执行
sed -i '1i #!/bin/bash' script.sh
chmod +x script.sh
第一行为脚本指定 Bash 解释器 '1i' 插入指令:1 表示第一行,i 表示在指定行之前插入内容。 若用 a 则在该行之后插入 Shebang 声明,指定脚本解释器路径。
常见解释器路径
| 解释器路径 | 适用场景 | 示例 |
|---|---|---|
#!/bin/bash | 需 Bash 扩展功能(如数组、正则) | 复杂脚本开发 |
#!/bin/sh | 兼容 POSIX Shell(轻量但功能受限) | 跨平台脚本 |
#!/usr/bin/env python | 调用环境变量中的解释器(增强可移植性) | 多版本 Python 环境 |
chmod +x script.sh 为脚本文件添加可执行权限的命令,使其能够直接运行。
+x:增加执行权限(x表示 execute)。
权限细节
1. 权限类型与范围
- 权限分类:
- 用户(u):文件所有者。
- 组(g):文件所属用户组。
- 其他(o):其他所有用户。
- 所有(a):默认覆盖以上三类(等价于
ugo)。
- 权限类型:
| 符号 | 权限 | 数字值 |
|------|--------|--------|
|r| 读 | 4 |
|w| 写 | 2 |
|x| 执行 | 1 |
2. +x 的实际效果
- 命令行为:
- 为 所有用户(
a)添加执行权限,即chmod a+x script.sh。 - 若需限定范围,可明确指定:
chmod u+x script.sh # 仅所有者可执行 chmod ug+x script.sh # 所有者及组用户可执行
- 为 所有用户(
脚本的参数
- 脚本调用时的参数,在脚本中使用‘
- 所用参数:
$@
bash变量
a=100
echo $a
b=我是谁
echo <data class="katex-src" value="{a}"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord"><span class="mord mathnormal">a</span></span></span></span></span></data>{b}
- 变量需要额外的$来指定
- 变量声明时赋值号的左右都不能有空格
变量的引用
- 无引用时,空格起作用
- 单引号时,$没有引用变量作用,只是普通的字符串
- 双引号时,$引用变量的值
a=100
echo "$a" # 输出100
echo '$a' # 输出'<data class="katex-src" value="a'
echo \""><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>a</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>e</mi><mi>c</mi><mi>h</mi><mi>o</mi><mi mathvariant="normal">"</mi></mrow><annotation encoding="application/x-tex">a'
echo "</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">ec</span><span class="mord mathnormal">h</span><span class="mord mathnormal">o</span><span class="mord">"</span></span></span></span></data>{a}" # 输出100
引用变量的执行结果
$(command):执行命令并将命令运行的标准输出赋值给变量- 分隔的列表被转成由空格分隔
a=<data class="katex-src" value="(seq 100)
echo "><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>s</mi><mi>e</mi><mi>q</mi><mn>100</mn><mo stretchy="false">)</mo><mi>e</mi><mi>c</mi><mi>h</mi><mi>o</mi></mrow><annotation encoding="application/x-tex">(seq 100)
echo </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">se</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mord">100</span><span class="mclose">)</span><span class="mord mathnormal">ec</span><span class="mord mathnormal">h</span><span class="mord mathnormal">o</span></span></span></span></data>a
egrep ^23+$表示匹配行首,2固定,3+表示至少有一个3,$表示行尾
n2333=<data class="katex-src" value="(seq 10000 | egrep ^23+"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>s</mi><mi>e</mi><mi>q</mi><mn>10000</mn><mi mathvariant="normal">∣</mi><mi>e</mi><mi>g</mi><mi>r</mi><mi>e</mi><msup><mi>p</mi><mn>2</mn></msup><mn>3</mn><mo>+</mo></mrow><annotation encoding="application/x-tex">(seq 10000 | egrep ^23+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">se</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mord">10000∣</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">re</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord">3</span><span class="mord">+</span></span></span></span></data>)
echo <data class="katex-src" value="n2333
echo "><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mn>2333</mn><mi>e</mi><mi>c</mi><mi>h</mi><mi>o</mi></mrow><annotation encoding="application/x-tex">n2333
echo </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">n</span><span class="mord">2333</span><span class="mord mathnormal">ec</span><span class="mord mathnormal">h</span><span class="mord mathnormal">o</span></span></span></span></data>{#n2333} # 输出字符个数
bash数组
- 类似于python的列表,可以储存任意元素
busket=()
busket+=( 香蕉 猕猴桃 水蜜桃 西瓜 )
echo ${busket} # 按普通变量取值,只有第一个元素
echo ${busket[3]} # 按数组下标取值
echo ${busket[@]} # 按数组取值,输出所有元素
echo ${#busket[@]} # 输出元素个数
bash字典
- 又称关联数组,类似python的字典
declare -A cargo # 声明字典
cargo[apple]=100
cargo[banana]=200
echo ${cargo[apple]} # 输出 apple 对应的 value
echo ${!cargo[@]} # 输出所有 key
echo ${cargo[@]} # 输出所有 value
bash算术
- 在bash中字符串的使用更便利,万物皆字符串,算数运算需要辅助
- 但比用管道和$()简洁
echo $((1+1)) $((3*5))
echo $(echo 1+3 | bc) $(echo 2*4 | bc)
- 这里bc是外部计算器
- 计算能力有限,只能简单计算
echo $((2**100)) # 输出0
echo $(echo "2^100" | bc) # 输出正确结果
bash程序结构
1. 选择结构
if [ condition1 ]; then
# 条件成立时执行的代码
if [ 3 -gt 2 ]; then
echo "3 大于 2"
else
echo "3 不大于 2"
fi
2. 判断语句
-
[···]是一个程序,与使用test命令等价 -
真假判断来自该程序执行的返回值。
- 返回值:0表示真,非0表示假。与一般的语言正好相反
-
$?or${?}变量值是前一条命令的返回值
test 1 = 2 # false 返回非0
echo $? # 输出非0
test 2 != 3 # true 返回0
echo $? # 输出0
bash内建真假判断
- 内建命令
[[···]],与[···]类似,但支持更多功能 - 内建命令调用速度更快
- 命令层次的逻辑运算
command1 && command2取与command1 || command2取或! command取反
- 逻辑运算可以替代选择结构
[[ 3 -gt 2 ]] && echo "3 大于 2" || echo "3 不大于 2"
&& 逻辑与运算符
- 若左侧命令成功(返回
0),则执行右侧命令;否则跳过。 - 此处因条件为真,执行
echo "3 大于 2"。
|| 逻辑或运算符
- 若左侧命令失败(返回非
0),则执行右侧命令。 - 此处因
&&已成功执行,跳过echo "3 不大于 2"。
3. 循环结构
for循环:
for i in $(seq 10); do
s=$(($s+$y))
x=${y}
y=${s}
done
echo $y
- while循环:
seq 1000 | while read line; do
echo $line | egrep -q '^23+$' && echo $line
done
- until 循环
- 与 while 相似,但条件为假时执行
seq 1000 | until ! read line; do
echo $line | egrep -q '^23+$' && echo $line
done
- 循环控制命令
break:跳出当前循环continue:跳过当前循环,继续下一轮循环
seq 10000 | while read line; do
if echo $line | egrep -q '^23+$'; then
echo "$line,找到匹配."
break
fi
done
bash函数
1. 定义函数
function greet(){
echo "Hello, $1!"
}
2. 函数递归
- 递归计算fabonacci数
- return 给返回值只能用$?捕捉或者用于逻辑运算
function fib(){
if [ $1 -le 2 ]; then
echo 1
else
echo <data class="katex-src" value="(("><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">((</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">((</span></span></span></span></data>(fib <data class="katex-src" value="(("><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">((</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">((</span></span></span></span></data>1-1))) + <data class="katex-src" value="(fib "><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>f</mi><mi>i</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">(fib </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">ib</span></span></span></span></data>(($1-2)))))
fi
}
echo $(fib 10)
3. bash的代码块与子进程
- {```}代表一个代码块,可以把多行代码合成为一个总单元
- (```)使用复刻(fork)一个bash运行代码。
- 子bash中的变量设置不影响外层bash
s=1
(s=2;)
echo $s # 输出1
- 类似于
$(seq 100)代表复刻后运行seq提取标准输出
bash调试
- 除了直接交互和使用echo输出中间结果之外:
set -xv开启调试模式,set +xv关闭调试模式,bash -xv script.sh以调试模式执行脚本。- -vprint 设立了input lines as they are read.
- -xprint commands and their arguments as they are executed.