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 # 所有者及组用户可执行
      

脚本的参数

  • 脚本调用时的参数,在脚本中使用‘1,1’, </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">1’</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">‘</span></span></span></span></data>2, ... 来引用。
  • 所用参数:$@

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'
&#10;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">&quot;</mi></mrow><annotation encoding="application/x-tex">a&#x27;
 echo &quot;</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">&quot;</span></span></span></span></data>{a}" # 输出100

引用变量的执行结果

  • $(command):执行命令并将命令运行的标准输出赋值给变量
  • 分隔的列表被转成由空格分隔
a=<data class="katex-src" value="(seq 100)
&#10;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
&#10;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.