Hello Linux!

Hello Linux围绕Linux基础操作Linux下的开发工具Linux操作补充Shell Script四个部分展开

[toc]

Linux基础操作

  1. ls:

    1
    2
    3
    4
    ls [选项] [文件]
    选项:
    -a 显示包括隐藏项目在内的所有项目
    -l 列出文件详细信息,每行一个文件
  2. touch

    1
    touch [选项] [文件名]		创建新文件或更新现有文件时间戳
  3. mkdirrmdir

    1
    2
    mkdir [选项] 目录名		创建新文件夹/目录
    rmdir [选项] 目录名 删除空文件夹/空目录
  4. pwd

    1
    pwd			查看当前绝对路径 一般从/home开始显示
  5. cd

    1
    cd [选项] 目录名			跳转到指定目录
  6. rm

    1
    2
    3
    4
    5
    rm [选项] 文件名
    选项:
    -r 递归删除目录及其内容,删除一个非空目录必须加-r
    -f 强制删除不提示确认
    -i 交互式(即总是会询问用户是否确定删除)

    使用 rm 命令要格外小心,因为一旦删除了一个文件,就无法再恢复它。一些用户 会在家目录下建一个类似回收站的目录,如果要使用rm命令,先把要删除的文件 移到这个目录里,然后再进行rm,一定时间之后再对回收站里的文件进行删除。

    1
    rm [选项] *.扩展名

    使用该指令可以删除当前目录下所有具有指定拓展名的文件。若要避免误删可加上 -i 选项进行交互式确认。

  7. cp

    1
    2
    3
    cp [选项]  源文件  目录
    选项:
    -r 递归复制目录及其子目录的所有内容
    1
    2
    cp file1.txt file2.txt			 # 将 file1.txt 复制到当前目录下并命名为 file2.txt
    cp file1.txt file2.txt dest/ # 将file1.txt file2.txt 复制到dest/下 dest 为当前目录下某一相对路径 或 绝对路径
  8. mv

    1
    mv [选项]  源文件  目录
    1
    2
    3
    mv file1.txt file2.txt dest/    	# 将file1.txt 和 file2.txt移动到dest/下
    mv oldname.txt newname.txt # 重命名
    mv source_dir destination_dir/ # 将source_dir目录移动到destination_dir目录下
  9. 常用快捷键:

    • Ctrl + C:终止当前程序执行
    • Ctrl + Z:挂起当前程序
    • Ctrl + D:终止输入
    • Ctrl + L:清屏

Ctrl+Z挂起程序后会显示该程序挂起编号,若想要恢复该程序可以使用fg [job_spec]job_spec 即为挂起编号,不输入时默认为最近挂起进程。

​ 而如果你写了一个等到识别到EOF才停止的程序,你就需要输入Ctrl+D来当作输入了一个EOF

Linux下的开发工具

GCC(GNU Compiler Collection)

gcc(GNU project C and C++ compiler)是一款著名的C语言编译器。

OS_L0_G1

1
gcc [选项] ... [参数] ...
1
2
gcc test.c testfun.c -o test		# 这里 -o 表示将gcc编译后得到的可执行文件重命名
gcc -c test.c -o test.o # 这里 -c 表示仅编译汇编不链接
1
2
3
gcc [其他选项] -I<目录路径> 源文件 -o 可执行文件
gcc -c -Iinclude src/main.c -o main.o # 将src/main.c仅编译不链接
gcc -Iinclude src/main.c -o main # 利用定义在include下的头文件编译生成可执行文件

image-20250312205145846

OS_L0_G2

make工具

make工具一般用于维护软件开发的工程项目,它可以根据时间戳自动判断项目的哪些部分需要重新编译,每次只重编译必要的部分。make工具会读取Makefile文件,并根据Makefile的内容来执行相应的编译操作。

1
2
target: dependencies
command 1 ... # 注意command前必须是制表符tab

Linux操作补充

  1. find

    1
    find [搜索路径] [表达式]     # 搜索路径默认是当前目录 .
    1
    2
    find . -name "*.txt"        # 查找当前目录下所有扩展名为.txt的文件
    find . -iname "*.txt" # 不区分大小写地查找当前目录下所有扩展名为.txt的文件

    在上述例子中,-name表示按照文件名精确查找。支持使用通配符*(匹配任意多个字符) 和 ?(匹配单个字符)。

    1
    2
    find . -name "*.log" -print  	       # 将找到的文件或目录的名称打印到标准输出
    find . -name "*.bak" -exec rm {} \; # 删除当前目录下所有扩展名为 .bak 的文件:

    在上述例子中,-exec表示找到文件执行指定命令。命令以 {} 作为当前找到的文件的占位符,以 \; 作为命令结束标志。

  2. grep

    1
    grep [选项]  模式  [文件...]

    其中模式是指定要搜索的字符串或者正则表达式。

    文件是指定在那些文件中搜索,如果不指定,grep会从标准输入读取数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 匹配控制选项
    grep -i "hello" file.txt # -i 忽略大小写
    grep -w "cat" file.txt # -w 只匹配完整单词
    grep -x "This is a test." file.txt # -x 只匹配完整的行


    # 输出控制选项
    grep -n "error" log.txt # -n 在匹配输出时显示行号
    grep -v "apple" file.txt # -v 反转匹配 即输出不包含指定模式的行
    grep -c "warning" log.txt # -c 只输出匹配的行数,而不显示具体的匹配内容


    # 文件搜索选项
    grep -r "password" documents/ # -r 递归搜索指定目录及其子目录下所有文件
  3. diff

    1
    diff [选项]  文件1  文件2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 输出格式选项
    diff -u file1.txt file2.txt # -u 以统一格式输出差异 用+表示新增的行,-表示删除的行
    diff -y file1.txt file2.txt # -y 以并排格式输出差异,将两个文件的内容并列显示,中间用竖线分隔

    # 比较规则选项
    diff -i case1.txt case2.txt # -i 不区分大小写地比较
    diff -w case1.txt case2.txt # -w 不考虑空白符地比较

    # 目录比较选项
    diff -r dir1 dir2 # -r 递归比较目录及其子目录下的所有文件
  4. sed

    sed(stream editor)是一个强大的流编辑器,用于对文本进行过滤和转换。

    1
    sed  [选项]  编辑命令  文件名		# 若不指定文件名,将从标准输入读取数据	
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 选项:
    sed -n '3p' file.txt # -n 只输出指定行
    sed -e '2d' -e '3s/apple/banana/' file.txt # -e 执行多个编辑命令
    # 将 file.txt 文件中所有的 "hello" 替换为 "hi",并直接修改文件内容
    sed -i 's/hello/hi/g' file.txt # -i 直接修改文件内容

    # 编辑命令:
    # 打印 file.txt 文件中第 2 行到第 4 行的内容
    sed -n '2,4p' file.txt # 打印2至4行
    sed '3,$d' file.txt # 删除第3行到最后一行
    sed 's/cat/dog/2' file.txt # 只替换每行的第二个cat
    sed 's/cat/dog/g' file.txt # 替换所有的cat
    sed '3a a new line' file.txt # 在第三行后追加一行
    sed '/example/a a new line' file.txt # 在包含example的行后追加“a new line”
    sed '5i add a new line before line 5' # 在第五行前插入一行
    sed '5c replace the fifth line' file.txt # 替换掉第五行
    sed 'y/abc/ABC' file.txt # 把abc用ABC替换掉
  5. awk

    1
    awk [选项]  'pattern { action }'  文件名

    其中pattern时用于匹配输入行的条件,action时匹配成功时执行的操作。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 选项:
    awk -F ',' '{ print $2 }' data.csv # 指定,为字段分割依据 默认空格
    awk -v prefix="Line: " '{ print prefix $0 }' test.txt # -v 定义变量
    awk -v threshold=15 '{ if ($1 > threshold) print $1 }' numbers.txt

    # 模式:
    awk '{ print $0 }' input.txt # 空模式 若未指定模式,awk对每一行都执行对应操作
    awk '/pattern/ { print $0 }' input.txt # 打印匹配到的行
    awk '$1 == "apple" { print $0 }' input.txt # 打印第一个字段为apple的行

    # 动作:
    awk '{ print $1, $3 }' input.txt # 打印每行的第1,3个字段
    awk '{ sum = $1 + $2; print sum }' input.txt # 计算每行1,3字段的和并打印
    awk '{ if ($1 > 10) { print "Greater than 10" } else { print "Less than or equal to 10" } }' input.txt
    1
    2
    3
    4
    5
    6
    7
    # awk 内置变量
    $0:表示当前处理的整行内容。
    $n:表示当前行的第 n 个字段,n 从 1 开始。例如,$1 表示第一个字段,$2 表示第二个字段。
    NF:表示当前行的字段数量。
    NR:表示当前处理的行号,从 1 开始。
    FNR:表示当前文件的行号,在处理多个文件时与 NR 有所不同。
    FS:表示字段分隔符,默认是空格或制表符。可以通过 -F 选项或在脚本中修改该变量的值。
  6. cat

    1
    2
    3
    4
    cat -n file.txt					# 添加行号地输出file.txt的内容到终端 
    cat file1.txt file2.txt # 将 file1.txt 和 file2.txt 的内容连接起来并输出到终端
    cat > newfile.txt # 从终端读入标准输入(覆盖)写入newfile.txt
    cat >> newfile.txt # 从终端读入标准输入(追加)写入newfile.txt

Shell Script

Linux下的Shell Script 类似于 Windows的批处理文件(.bat)。但是Linux当中没有拓展名的概念。

  1. 执行Shell Script:

    1
    ./文件名
  2. 添加“执行”权限:

    1
    chmod +x 文件名

    touch命令创建的文件默认没有执行权限,需要手动添加。

  3. 脚本文件分析:

    1
    2
    3
    #!/bin/bash
    #My first Shell script!
    echo "Hello, world!"
    • 第一行#!称为Shebang,程序加载器会将Shebang后面的内容作为脚本的解释器。
    • Shell脚本是命令和组合,事实上echo本身也是一条指令。在终端直接执行echo指令会直接输出内容。
  4. 变量:

    1
    var_name=value
    • 弱类型语言,无需指定类型,赋值等号两边不允许有空格
    • 使用${var_name}获取变量值。(或$var_name)
  5. 脚本参数:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    str="Hello, $1 and $2!"
    echo $str

    终端输入如下命令: ./hello.sh world OS
    输出: Hello, world and OS!
    #此处world和OS即是我们要传递的参数,分别对应$1,$2
    • 在执行语句中,参数以空格分隔,每一个参数在脚本中都是一个字符串变量。第一个参数映射到变量名1,第二个参数映射到变量名2。
    • 注意要在双引号中引用变量
    1
    2
    3
    4
    5
    #!/bin/bash
    str='Hello, $1 and $2!'
    echo $str

    输出: Hello, $1 and $2
    • 特殊变量$#:代表传递的参数个数
    • 特殊变量$*:代表字符串,内容是传递的全部参数
    • 特殊变量$?:获取前一条命令的返回值。(一条命令的返回值是0是表示其成功执行,作为条件时则视为其成立)

    事实上$n是把输入命令按照空格切分,n代表第几个词块,$0代表第0个词块,即命令本身。

  6. 条件与循环:

    注意等号前后不能有空格,左中括号后和右中括号前一定需要空格

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if condition1
    then
    command1
    ...
    elif condition2
    then
    ...
    else
    ...
    fi # 表示结束
    1
    2
    3
    4
    5
    6
    a=1
    while [ $a -ne 10 ]
    do
    mkdir file$a
    a=$[$a+1]
    done

    左中括号 [ 是一种常用作条件的命令,其参数是一个条件表达式和末尾的 ] ,该命令在关系成立时返回0。此外,true命令能够直接返回0,!命令能够反转参数中命令的返回值。

    1
    2
    3
    4
    5
    6
    -eq == (equal)
    -ne != (not equal)
    -gt > (greater than)
    -lt < (less than)
    -ge >= (greater or equal)
    -le <= (less or equal)
  7. 整数比较大小:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    mkdir files
    cd files
    i=1
    while (($i <= $1)) # (())用于比较整数的大小。也可换为[ $i -le $1 ]
    do
    touch "file$i.txt"
    i=$((i+1)) # $(())是bash中用于算术拓展的语法,可直接进行算术运算
    done

    # 该脚本用于在当前目录下新建一个files文件夹,在files里新建参数$1个.txt文件,依次命名为files1.txt, files2.txt...
  8. 函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/bin/bash
    function fun1() {
    echo "Hello, world!"
    }
    function fun2() {
    echo "I've got "$1" and "$2"!"
    }
    function fun3() {
    echo "I'm computing first + second!"
    return $(($1 + $2))
    }
    fun1
    fun2 2 3
    fun3 4 5
    echo "The sum is "$?"."
    • 函数可以不返回值
    • 函数调用方法如下:
    1
    fun_name param1 param2 ... paramN

    其中第 N 个参数在函数体内使用只会带第一位数字。如果函数有返回值,则在函数调用的后面需要使用$?获取返回值。

  9. 重定向:

    重定向实现了将命令的输出写入文件中的功能。在命令后使用>符号可以将输出重定向。

    1
    2
    3
    ls / > lsoutput.txt

    该命令实现将根目录下所有文件名输出到当前目录的lsoutput.txt文件中

    重定向会覆盖文件的原有内容

    注意,>1> 的简写。在我们刚才提到的三种流中,0 是标准输入,1 指的是标准输出,而不包括标准错误输出。gcc 输出的编译错误消息属于标准错误输出。如果想要将错误输出到文件,需要使用 2>,也就是将错误输出重定向到文件。

<是将文件的内容作为输入,以取代标准输入。

  1. 管道:
1
command1 | command2 | command3

管道对命令进行连接,以上内容是将 command1 的输出传给 command2 的输入,command2 的输出传给 command3 的输入,以此类推。

1
2
3
4
5
a.txt内容为:Hello,world!
b.txt内容为:Hello,OS!

cat a | cat >> b
将a的内容追加至b