OS预习
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的基本输入操作
用法:
vim 文件名
- 按
I
进入插入模式,可以开始输入文本内容 - 完成文件修改后,按
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文件
cd 目标目录
:决定一个存.c文件的位置,打开该目录touch 名字.c
:新建一个.c文件vim 名字.c
:编辑.c文件(相关vim操作见上)gcc -o "可执行文件名字" 名字.c
:编译.c文件,并给生成的可执行文件起个名字./可执行文件名字 < in.txt > out.txt
:执行可执行文件,并利用重定向获取输入和输出(in.txt
需要提前建好。out.txt
如果原来没有,会自动生成,有了会覆盖掉原来的)
Git
Git 中文件的四种储存状态
一个文件,在 Git 目录中有以下四种状态:
- 未跟踪(Untracked):一个文件在储存库的版本信息中没有被记录过。比如在储存库中新建了一个文件,这个文件现在就是未跟踪的状态;在一个非空目录下使用
git init
来初始化一个空储存库,此时这个目录下的所有文件都处于未跟踪的状态。 - 未修改(Unmodified):一个文件在跟踪之后一直没有改动过,或者改动已经被提交(即工作区的内容和储存库中的内容相同),则处于未修改状态。当我们修改这个文件时,则会使这个文件变成已修改状态。
- 已修改(Modified):一个文件已经被修改(即工作区的内容和储存库中的内容不同),但还没有加入(
git add
) 到暂存区中。 - 已暂存(Staged):一个文件已被加入暂存区。加入暂存区意味着将一个已修改的文件加入下次提交(
git commit
)需要存入储存库的文件清单中。
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
:将远程新建的分支下载到本地,并且将远端的更改合并到当前的分支。在利用评测机进行实验分支的初始化之后,可以在开发机中使用这个命令来将新的分支下载到本地。
在这里贴一张gitlab上关于git操作的说明,感觉还较为全面
常用操作就是:
先
git clone 上传目标库的ssh
将想要上传的文件拖进
git clone
出的文件夹中git add .
git commit -m "提交说明"
git push
这样就可以将我们要上传的文件成功上传到库中了
Shell脚本
shell脚本执行
Shell 脚本执行时,如果没有权限,我们可以使用下面的命令手动添加“执行”权限。
chmod +x 文件名 |
Bash Shell 语法基础
首先用 touch
命令创建一个新文件 hello.sh
,使用 Vim 输入以下内容:
#!/bin/bash |
第一行:指定脚本的默认运行程序(即解释器)。在这里指定为 bash,这是我们最常使用的脚本运行程序。
其中,
#!
出现在脚本文件的第一行的前两个字符,被称为 Shebang。当文件中存在 Shebang 的情况下,程序加载器会分析 Shebang 后面的内容,并且将这些内容作为脚本文件的解释器。
第二行:注释。注释以 #
开头。
第三行:输出。将 echo
命令后面的字符串输出。
变量
定义方式为:var_name=value
(注意:= 两边不允许有空格)
使用$var_name
可以获取变量的值。在使用时,建议在变量名的两端加一个花括号(形如 ${var_name}
),以帮助解释器识别变量的边界,避免歧义。
例如:
#!/bin/bash |
脚本参数
我们将hello.sh
的内容修改为:
#!/bin/bash |
再输入$ ./hello.sh world OS
我们可以得到Hello, world and OS!
即用执行命令中的world
和OS
替代脚本中的$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”。elif
和else
可以按需省略。下面举例说明:
#!/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() { |
其中 function
和 ()
可以省略其中一个。其中返回语句是可选的,函数可以不返回值。int_value
是一个0 - 255之间的整数,返回其他值是未定义的行为,一般会返回一个错误的结果。
函数的调用方法如下:
fun_name param1 param2 ... paramN |
其中第 N 个参数在函数体内使用 $N
来获取,且不需要在函数定义开头声明。值得注意的是,当 N>=10 时,需要用 ${N}
来获取参数,否则 $
只会带第一位数字。如果函数有返回值,则在函数调用的后面需要使用 $?
获取返回值。例子如下:
#!/bin/bash |
其中,$(($1 + $2))
的意思是先计算 $1 + $2
的值。