Linux基础

目录操作

  • cd

    用法:cd 目录

    作用:切换到该目录(类似于打开文件夹)

    cd /:/ 代表根目录,即Linux文件系统的最顶层
    cd ~:~当前用户主目录,对于一般用户,主目录是/home/用户名;如果当前用户是系统管理员(root)用户,主目录是/root
    cd /etc/test:切换到etc目录下的test目录(可以理解为打开test文件夹)

    cd test:cd命令支持相对路径,如果系统在etc目录,可以输入cd test直接访问test目录

    cd ..表示当前目录
    cd ....表示上一级目录
    cd --表示上一次访问的目录

  • ls

    用法:ls [选项] [目录][]代表可有可无)

    作用:列出目录中的文件

    常用选项:

    -a:显示隐藏的文件(文件名以 . 开头的文件)

    -l:每行只列出一个文件

  • mkdir

    用法:mkdir 目录

    作用:创建一个新目录

  • pwd

    用法:pwd [选项]

    作用:输出当前目录的绝对路径

  • rmdir

    用法:rmdir [选项] 目录

    作用:删除一个空的目录。注意:只能是空目录

文件操作

文件操作的对象是几乎所有文件,也包含目录

  • touch

    用法:touch [选项] 文件名

    作用:当文件不存在时创建新文件,当文件存在时更新文件的时间戳

    注意:不能用touch新建目录,要使用mkdir

  • rm

    用法:rm [选项] 文件

    作用:删除文件

    常用选项:

    -r:递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除

    -f: 强制删除,不提示用户确认,忽略不存在的目录

    -i: 逐一提示用户确认每个将要被删除的文件

    注意:rm -rf一定慎用,全删了,非必要不使用

  • cp

    用法:cp [选项] 源文件 目标路径

    作用:将源文件(或目录)复制到目标路径对应的文件或目录

    常用选项:

    -r:递归移动目录及其子目录内的所有内容

  • mv

    用法:mv [选项] 源文件 目标路径

    作用:类似于剪切,将源文件移动至目标位置

    常用选项:

    -r:递归移动目录及其子目录内的所有内容

    mv也可以用来重命名文件比如mv test.txt test2.txt就可以实现对test.txt的重命名

  • diff

    用法:diff [选项] 文件1 文件2

    作用:比较两个纯文本文件的差异

    常用选项:

    -b:不检查空白字符的不同

    -B:不检查空行

    -q:仅显示有无差异,不显示详细信息

  • vim

    Vim是Linux系统下的一款开源编辑器,编辑效率很高,下面介绍Vim的基本输入操作

    用法:

    1. vim 文件名
    2. I进入插入模式,可以开始输入文本内容
    3. 完成文件修改后,按Esc回到命令模式,再按Shift + ;进入底线命令模式,可以看到最后一行出现冒号。输入w并按回车可以保存文件,输入q并按回车可以关闭文件,也可以合并输入wq即可保存并关闭文件

查找操作

  • find

    用法:find [路径] 选项

    作用:在给定路径下递归地查找文件,输出符合要求的文件的路径。如果没有给定路径,则在当前目录下查找。

    常用选项:

    -name 文件名 :指定需要查找的文件名。

    例如在当前目录下查找所有名为test.c文件的操作为find -name test.c

  • grep

    用法:grep [选项] PATTERN FILE(PATTERN是匹配字符串,FILE是文件或目录的路径)

    作用:输出匹配字符串PATTERN的文件和相关的行

    常用选项:

    -a:不忽略二进制数据进行搜索

    -i:忽略大小写差异

    -r:从目录中递归查找

    -n:显示行号

  • tree

    用法:tree [选项] [目录名]

    作用:高级版的ls,输出目录下的文件树

    常用选项:

    -a:列出全部文件(包含隐藏文件)

    -d:只列出目录

其他命令

  • man

    用法:man [选项] 命令 阅读完毕后按Q退出

    作用:查看该命令的详细说明手册

  • echo

    用法:echo 要输出内容

    作用:直接在终端输出内容

常用快捷键

  • Ctrl + C:终止当前程序执行。注意:在终端复制时就老老实实用右键复制,以免误杀进程。
  • Ctrl + Z:挂起当前程序,暂停,放到后台Ctrl + Z挂起程序后会显示该程序挂起编号,若想要恢复该程序可以使用 fg [job_spec]即可,job_spec 即为挂起编号,不输入时默认为最近挂起进程。
  • Ctrl + D:终止输入,在标准输入中输入Ctrl+D也意味着输入了一个 EOF。
  • Ctrl + L:清屏,相当于命令clear
  • 方向键 上 下:切换最近使用过的命令。

相关实用工具

GCC

GCC包含了著名的 C 语言编译器 gcc

用法:gcc [选项] 源代码文件

作用:编译该文件

我们可以先输入gcc hello.c编译hello.c文件并在目录下出现a.out文件,我们再通过命令./a.out执行a.out文件获得输出(注意:一定要有./

构建并编译运行一个.c文件

  1. cd 目标目录:决定一个存.c文件的位置,打开该目录
  2. touch 名字.c:新建一个.c文件
  3. vim 名字.c:编辑.c文件(相关vim操作见上)
  4. gcc -o "可执行文件名字" 名字.c:编译.c文件,并给生成的可执行文件起个名字
  5. ./可执行文件名字 < in.txt > out.txt:执行可执行文件,并利用重定向获取输入和输出(in.txt需要提前建好。out.txt如果原来没有,会自动生成,有了会覆盖掉原来的)

Git

Git 中文件的四种储存状态

一个文件,在 Git 目录中有以下四种状态:

  • 未跟踪(Untracked):一个文件在储存库的版本信息中没有被记录过。比如在储存库中新建了一个文件,这个文件现在就是未跟踪的状态;在一个非空目录下使用 git init 来初始化一个空储存库,此时这个目录下的所有文件都处于未跟踪的状态。
  • 未修改(Unmodified):一个文件在跟踪之后一直没有改动过,或者改动已经被提交(即工作区的内容和储存库中的内容相同),则处于未修改状态。当我们修改这个文件时,则会使这个文件变成已修改状态。
  • 已修改(Modified):一个文件已经被修改(即工作区的内容和储存库中的内容不同),但还没有加入(git add) 到暂存区中。
  • 已暂存(Staged):一个文件已被加入暂存区。加入暂存区意味着将一个已修改的文件加入下次提交(git commit)需要存入储存库的文件清单中。

image-20240225232606403

git常用命令

  • git init:把当前目录变成一个空的 Git 仓库,这样就可以对当前目录下的内容进行版本管理了。

  • git clone:“克隆”一个已有的储存库到当前目录下。通常我们会从一个互联网地址(即 URL,统一资源定位符)进行克隆,所以一般这种操作可以理解为“下载”。

  • git status:查看当前分支的状态,以及当前工作区的变动和暂存区的内容,便于我们对工作区的概况进行掌握。

  • git add:把一个新文件或者已经修改过的文件加入暂存区中。在你完成一部分实验内容之后,可以使用git add . 将所有修改加入暂存区,也可以使用 git add <filename> 来将指定的文件加入暂存区。

  • git restore:我们在修改一个文件之后,可能想要放弃这个修改。当这个文件还没有通过 git add 加入暂存区时,我们可以使用 git restore <filename> 来撤销对这个文件的修改,使其退回到上一个 commit 的状态。如果这个文件已经加入了暂存区,我们可以通过 git restore --staged <filename> 来取消暂存。

  • git checkout:这个命令涉及到分支的知识,使用 git checkout lab<x> 可以切换到相应的分支。注意,在切换时,需要保证目前所有文件的状态均为“未修改”(没有修改过,或者已经提交)。

  • git commit:使用 git commit -m <message> 这个命令将暂存区的修改提交到储存库中。当 message 参数有空格时需要把 message 用引号括起来。在提交时,要求给出一段说明性文字。这段文字可以任意填写,但建议按照提交内容填写,以保证多人协作时的可读性。

  • git push:将本地的 commit 推送到一个远程仓库。

  • git pull:将远程新建的分支下载到本地,并且将远端的更改合并到当前的分支。在利用评测机进行实验分支的初始化之后,可以在开发机中使用这个命令来将新的分支下载到本地。

    image-20240225232151061

image-20240225232215486

在这里贴一张gitlab上关于git操作的说明,感觉还较为全面

常用操作就是:

  1. git clone 上传目标库的ssh

  2. 将想要上传的文件拖进git clone出的文件夹中

  3. git add .

  4. git commit -m "提交说明"

  5. git push

    这样就可以将我们要上传的文件成功上传到库中了

fda83e04fcb352a17c3fc3a3295f7d4

Shell脚本

shell脚本执行

Shell 脚本执行时,如果没有权限,我们可以使用下面的命令手动添加“执行”权限。

chmod +x 文件名

Bash Shell 语法基础

首先用 touch 命令创建一个新文件 hello.sh,使用 Vim 输入以下内容:

#!/bin/bash
#My first Shell script!
echo "Hello, world!"

第一行:指定脚本的默认运行程序(即解释器)。在这里指定为 bash,这是我们最常使用的脚本运行程序。

其中,#! 出现在脚本文件的第一行的前两个字符,被称为 Shebang。当文件中存在 Shebang 的情况下,程序加载器会分析 Shebang 后面的内容,并且将这些内容作为脚本文件的解释器。

第二行:注释。注释以 # 开头。

第三行:输出。将 echo 命令后面的字符串输出。

变量

定义方式为:var_name=value(注意:= 两边不允许有空格

使用$var_name 可以获取变量的值。在使用时,建议在变量名的两端加一个花括号(形如 ${var_name}),以帮助解释器识别变量的边界,避免歧义。

例如:

#!/bin/bash
str="Hello, world!"
echo $str

脚本参数

我们将hello.sh的内容修改为:

#!/bin/bash
str="Hello, $1 and $2!"
echo $str

再输入$ ./hello.sh world OS我们可以得到Hello, world and OS!即用执行命令中的worldOS替代脚本中的$1$2

如果命令中的参数不够,则不输出脚本中多出来的脚本参数;

除了 $1$2 ,还有一些其他的特殊变量:

  • $# :传递的参数个数;
  • $*:一个字符串,内容是传递的全部参数。

条件与循环

  • if 语句

    if 语句块的格式如下:

    if condition1
    then
    command11
    command12
    ......
    elif condition2
    then
    command21
    command22
    ......
    else
    command31
    command32
    ......
    fi

    其中,fi 是“if”的倒写,代表 if 语句块的结束;elif 意为“else if”。elifelse 可以按需省略。

    下面举例说明:

    #!/bin/bash
    if (( $1 > $2 ))
    then
    echo "first > second"
    elif (( $1 < $2 ))
    then
    echo "first < second"
    elif (( $1 == $2 ))
    then
    echo "first == second"
    else
    echo "I don't know..."
    fi

    其中 (()) 是用于比较整数之间大小的表达方式。传入字符串或浮点数,则是未定义的行为。

  • while语句

    while 语句块的格式如下:

    while condition
    do
    command1
    command2
    ...
    done

    其中 done 表示“do”语句块的结束。下面举例说明。

    #!/bin/bash
    mkdir files
    cd files
    i=1
    while (($i <= $1))
    do
    touch "file$i.txt"
    let i=i+1 # or i=$((i+1))
    done

    这里,let 是为变量赋值的命令,与之等价地,也可以使用 i=$((i+1))

函数

Shell 脚本也支持函数。函数的定义方式如下:

function fun_name() {
body...
return int_value;
}

其中 function() 可以省略其中一个。其中返回语句是可选的,函数可以不返回值。int_value 是一个0 - 255之间的整数,返回其他值是未定义的行为,一般会返回一个错误的结果。

函数的调用方法如下:

fun_name param1 param2 ... paramN

其中第 N 个参数在函数体内使用 $N 来获取,且不需要在函数定义开头声明。值得注意的是,当 N>=10 时,需要用 ${N} 来获取参数,否则 $ 只会带第一位数字。如果函数有返回值,则在函数调用的后面需要使用 $? 获取返回值。例子如下:

#!/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 + $2)) 的意思是先计算 $1 + $2 的值。