写在前面
Linux是一种开源的操作系统,在linux系统中,一切皆文件,因此命令行是与系统交互的主要方式。本文档将介绍一些常用的Linux指令,帮助你更好地理解和使用Linux系统。
目录操作
cd
常见指令如下:
cd / // 切换到根目录 cd .. // 切换到上一级目录 cd ~ // 切换到当前用户的主目录 cd - // 切换到上一次所在的目录
|
同时,cd命令也支持相对路径和绝对路径。例如:
cd /home/user/Documents // 绝对路径 cd ../Downloads // 相对路径
|
ls
ls 用来查看当前目录下的文件和文件夹。
常见指令如下:
ls // 列出当前目录下的文件和文件夹 ls -1 //每行一个列出当前目录下的文件和文件夹 ls -a // 列出当前目录下的所有文件和文件夹,包括隐藏文件
|
mkdir
mkdir 用来创建新的目录。
rmdir
rmdir 用来删除空目录。
pwd
pwd 用来显示当前所在的目录绝对路径。
PS:所有的目录指令都要注意当前所处的目录位置。
文件操作
touch
touch 用来创建新的文件。
rm
rm 用来删除文件。
常见指令如下:
rm -i <文件名称> // 删除文件前进行确认 rm -f <文件名称> // 强制删除文件,不进行确认 rm -r <目录名称> // 递归删除目录及其内容
|
cp
cp 用来复制文件或目录。
常见指令如下:
cp <源文件> <目标目录> // 复制文件到目标目录 cp -r <源目录> <目标目录> // 递归复制目录及其内容到目标目录
|
mv
mv 用来移动或重命名文件或目录。
常见指令如下:
mv <源文件> <目标目录> // 移动文件到目标目录 mv <源目录> <目标目录> // 移动目录到目标目录 mv <源文件或目录> <新名称> // 重命名文件或目录
|
diff
diff 用来比较两个文件或目录的内容差异。
vim
vim 是一个强大的文本编辑器,用于编辑文件。
vim <文件名称> // 打开文件进行编辑 I // 进入插入模式,可以编辑文件内容 edit // 编辑文件内容 Esc // 退出插入模式,回到命令模式 Shift + ; // 进入命令模式,可以执行保存、退出等命令 wq // 保存并退出 ./<文件名称> // 文件运行
|
cat
cat 用来查看文件内容。
文件查找
find
find 用于查找某个名字的文件。
tree
tree 用来以树状结构显示目录结构。
常见指令如下:
tree //显示当前目录的树状结构 tree <目录> //显示指定目录的树状结构 tree -d //只显示目录,不显示文件 tree -a //显示所有文件和目录,包括隐藏文件 tree -L <层级> //限制显示的目录层级
|
文件编辑
之前了解到vim可以用来编辑文件,接下来介绍文本编辑常用的三驾马车:grep、sed和awk。
grep
grep 用于在文本中搜索匹配的字符串。
常用指令如下:
grep -i "要查找的字符串" <文件名> // 忽略大小写进行搜索,输出形式为 匹配行的内容 grep -r "要查找的字符串" <目录> // 目录递归搜索,输出形式为 文件路径:匹配行的内容 grep -n "要查找的字符串" <文件名> // 输出形式为 行号:匹配行的内容
|
sed
sed 是一个流编辑器,用于对文本进行替换、删除、插入等操作。
选项主要有:
-i // 直接修改文件内容,否则不改变文件,只在终端输出 -n // 只输出被修改的行,否则输出整个文件
|
常用命令如下,注意一般情况下使用单引号 ' 来包裹命令。
sed '2a 要插入的文本' <文件名> // 在第2行后插入文本(Append) sed '2i 要插入的文本' <文件名> // 在第2行前插入文本(Insert) sed '2c 要替换的文本' <文件名> // 替换第2行的文本(Change) sed '2d' <文件名> // 删除第2行(Delete) sed -n '2p' <文件名> // 只输出第2行(Print) sed -n '2,4p' <文件名> // 输出第2行到第4行的内容 sed 's/要替换的字符串/替换后的字符串/g' <文件名> // 替换文件中所有匹配的字符串(Substitute)
|
awk
awk 用于对文本进行模式匹配和处理,常用于文本分析和数据处理。常见的使用模板如下:
匹配模式决定处理哪些行。可以是正则表达式、行号限制等。如果不写,默认处理每一行;执行动作决定找到指定的行之后干什么,如果不写,默认打印出找到的行。
awk 最强大的地方在于,每读入一行文本,它就会自动按照空格或Tab键把这行文本切成若干块。同时还为我们提供了极其方便的内置变量,见下表:
| 变量名 |
详细解释与用途 |
$0 |
代表当前这一整行的内容。 |
$1, $2… |
代表被切割后的第 1 列、第 2 列…以此类推。 |
NF |
Number of Fields:当前行一共有多少列。$NF 通常用来表示最后一列。 |
NR |
Number of Records:当前的行号。处理到第 5 行,NR 就是 5。 |
FS |
Field Separator:字段分隔符。默认是空格/Tab,可以用 -F 选项修改。 |
光看这些可能有点抽象,我们来看一个例子:
grep -n "hello" <文件名> | awk -F ":" '{print "第"$1"行的内容是: "$2}'
|
tail
tail 用于查看文件的最后几行内容。通常用于输出文件最后几行内容到终端。
tail -n <行数> <文件名> // 输出文件最后n行内容 tail -n +<行数> <文件名> // 从第n行开始输出文件内容
|
文件阅读
ctags 用于生成代码标签,帮助开发者快速定位代码中的函数、变量等定义。
为了跨目录使用,首先打开~/.vimrc文件,添加以下内容:
set tags = tags set autochdir
|
假设hello.c文件中有void test_ctags()函数,我们在 second 目录下新建ctags_test.c文件,输入以下内容:
#include <stdio.h> int main() { test_ctags(); return 0; }
|
在当前目录下使用以下命令生成tags文件:
ctags -R * // 递归生成当前目录及子目录下所有文件的标签
|
得到的目录架构为:
. ├── hello.c ├── second │ └── test_sctags.c └── tags
|
接下来在second目录下进入 ctags_test.c 文件编辑,在test_ctags()函数名上按下 Ctrl + ] 键,vim会自动跳转到 test_ctags() 函数的定义处。再按下 Ctrl + t 键(可能也是 Ctrl + O),可以返回到之前的位置。
C语言编译
gcc
gcc 是GNU编译器套件,用于编译C语言程序。
gcc -E <源文件.c> -o <预处理文件.i> // 预处理阶段 gcc -S <源文件.c> -o <汇编文件.s> // 编译阶段 gcc -c <源文件.c> -o <目标文件.o> // 汇编阶段 gcc <目标文件.o> -o <可执行文件> // 链接阶段
gcc <源文件.c> -o <输出文件> // 直接编译并链接生成可执行文件 ./<输出文件> // 运行编译后的程序
|
快捷键操作
Ctrl + C // 终止当前正在运行的命令 Ctrl + Z // 暂停当前正在运行的命令 Ctrl + D // 结束输入,通常用于退出终端或结束文件输入 Ctrl + A // 将光标移动到行首 Ctrl + E // 将光标移动到行尾 Ctrl + U // 删除光标前的内容 Ctrl + K // 删除光标后的内容 Ctrl + L // 清屏 Up Arrow // 显示之前输入的命令 Down Arrow // 显示之后输入的命令 Tab // 自动补全命令或文件名
|
make & makefile
make 是一个自动化构建工具,用于管理和自动化编译过程。makefile 是一个文本文件,定义了构建规则和依赖关系。
target: dependencies command
|
target 分为两类:文件目标和伪目标。文件目标是指生成的文件,伪目标是指不生成文件的目标,通常用于执行特定的命令。例如:clean。
.PHONY: clean // 声明clean为伪目标
my_app: main.o utils.o gcc main.o utils.o -o my_app
main.o: main.c gcc -c main.c
utils.o: utils.c gcc -c utils.c
clean: rm -f *.o my_app
|
这里我们来看一个有意思的例子,注意这个例子设计很多知识盲区,建议深入理解一下。如果我们要操作的目录如下:
. ├── code │ ├── Makefile │ ├── fibo.c │ └── main.c ├── include │ └── fibo.h └── Makefile
|
现在,在根目录和code目录下的 Makefile 中输入内容,从而实现编译 code 目录下的 main.c 和 fibo.c 文件,并且在根目录链接生成可执行文件 fibo ,在 code 目录下生成 *.o 文件。最后在根目录的 Makefile 中添加 clean 功能,删除 code 目录下的 *.o 文件。很多第一次上手的同学都会在 Makefile 中写入 cd mv 等指令来实现目录切换和文件移动,其实大可不必,只要指明操作的路径即可。且看答案如何操作:
./Makefile //注意这就是个注释 .PHONY: clean //clean声明为<伪目标>,即执行的动作,注意 ":" 别漏
fibo: code/main.o code/fibo.o gcc code/main.o code/fibo.o -o fibo
code/main.o code/fibo.o: make -C code // 直接调用code目录下的Makefile进行编译
clean: rm -rf code/*.o (或者 make -C code clean 到 code 目录下的 Makefile 中编辑)
|
./code/Makefile //注意这也是个注释
all: main.o fibo.o
main.o: main.c gcc -I../include -c main.c -o main.o // 注意这里的-I参数指定了头文件的路径
fibo.o: fibo.c gcc -I../include -c fibo.c -o fibo.o
|
最后,我们说明一下 cd 为何无效,因为每个命令都在一个新的 shell 中执行, 所以无论你怎么 cd ,在下一条命令执行前都会返回到当前目录,等于没用。
Bash 脚本
bash 脚本是一种用来自动化执行一系列命令的脚本文件。它以.sh为扩展名,包含了Linux命令和控制结构.
一个简单的 bash 脚本包括三部分:
#!/bin/bash // 指定脚本的解释器
echo "Hello, World!" // 输出文本
|
如果在执行 bash 脚本时遇到权限问题,可以使用以下命令赋予执行权限:
如果不想解决权限问题,也可以直接使用以下命令运行脚本:
然后可以通过以下命令运行脚本:
变量
在 bash 脚本中,可以使用变量来存储和操作数据。变量不需要声明,直接赋值即可。
#!/bin/bash name="Alice" // 定义变量,注意等号两边不能有空格 echo "Hello, $name!" // 使用变量
|
参数
bash 脚本可以接受命令行参数,这些参数在脚本中通过特殊变量访问。
#!/bin/bash echo "第一个参数: $1" // 第一个参数 echo "第二个参数: $2" // 第二个参数
|
执行./<脚本文件.sh> arg1 arg2会输出:
两个特殊的参数:
**$#**:表示传递给脚本的参数个数。
**$@**:表示传递给脚本的所有参数,作为一个字符串。
条件语句
if condition then elif another_condition then else fi
|
这里的 condition 的形式为 [ expression ],其中 expression 可以是关系表达式、字符串比较等。并且 [ 和 e 以及 ] 和 n 之间必须有空格。
如果把单中括号换成双中括号 [[ expression ]],则可以使用更多的条件表达式,例如:[[ $a -gt 10 && $b -lt 20 ]]。
循环语句
这里特别注意一下 condition 的形式为 [ expression ],其中 expression 可以是关系表达式、字符串比较等。并且 [ 和 e 以及 ] 和 n 之间必须有空格。
函数
function function_name() { return int_value // 可选,返回一个整数值 }
|
Attention:函数调用时需要用$?来获取函数的返回值。
Bash 脚本语法
关系运算符
-eq == // 等于 -ne != // 不等于 -gt > // 大于 -ge >= // 大于等于 -lt < // 小于 -le <= // 小于等于
|
关于变量
- 变量只有在
"中才能展开,' 会阻止展开。例: sed -i "s/$2/$3/g" "$1" 正确,sed -i 's/$2/$3/g' "$1" 错误。
- 文件名最好用双引号括起来,以防止文件名中包含空格或特殊字符导致的问题。例同上。
- 算数运算常用以下指令:
let a=a+1 (( a++ )) (( a = a + 1 )) b=$(( a + 1 ))
|
我们不难看出双小括号常常用于算数表达式中,且在双小括号中变量不需要加 $ 符号。
关于字符串
这里主要介绍一下关于字符串的 测试操作符 :
-z "$str" // 判断字符串是否为空,返回true如果字符串长度为0 -n "$str" // 判断字符串是否非空,返回true如果字符串长度不为0 "$str1" == "$str2" // 判断两个字符串是否相等,返回true如果相等 "$str1" != "$str2" // 判断两个字符串是否不相等,返回true如果不相等 "$str1" > "$str2" // 判断字符串1是否大于字符串2,返回true如果字符串1大于字符串2,按照字典顺序比较 "$str1" < "$str2" // 判断字符串1是否小于字符串2,返回true如果字符串1小于字符串2,按照字典顺序比较
|
免交互文档
免交互文档 是指在执行命令时不需要用户进行交互输入的文档,多用于将一大段文本原封不动地传递给一段命令。常用的语法如下:
cat << EOF > <文件名> // 将EOF之间的内容写入文件 // 这里是要写入文件的内容 EOF
|
这里的EOF仅仅是自定义分隔符,你当然可以把他换成 APPLE, BANANA, BUAA 等等,只要保证分隔符前后一致即可。我们注意到,上述命令中的 EOF 并没有被 ' 或 " 包裹,这意味着在 EOF 之间的变量和命令会被shell进行解析,反之则原样输出。
小贴士:
脚本文件要善用重定向
重定向
重定向是指将命令的输入或输出重定向到文件或其他命令。Linux中有三种标准流:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。重定向可以用来将这些流重定向到文件或其他命令。
输出重定向
command > file.txt // 将命令的输出重定向到文件,覆盖原有内容 command >> file.txt // 将命令的输出重定向到文件,追加到原有内容 command 2> error.txt // 将命令的错误输出重定向到文件,覆盖原有内容 command 2>> error.txt // 将命令的错误输出重定向到文件,追加到原有内容
|
输入重定向
command < input.txt // 将文件的内容作为命令的输入
|
举个例子:
cat < input.txt // 将input.txt的内容输出到终端 grep "要查找的字符串" < input.txt // 在input.txt中搜索匹配的字符串
|
管道
管道(|)用于将一个命令的输出作为另一个命令的输入。
command1 | command2 // 将command1的输出作为command2的输入
|
几个明显的例子:
cat file.txt | grep "要查找的字符串" // 在file.txt中搜索匹配的字符串 cat a.txt | cat >> b.txt // 将a.txt的内容追加到b.txt中
|
权限操作
chmod 是 Linux 系统中用来改变文件或目录访问权限的指令。权限分为三类:User、Group和Other,每类权限又分为读(r)、写(w)和执行(x)三种。
添加权限时使用 +,删除权限时使用 -,设置权限时使用 =。
chmod u+x <文件名> // 给用户添加执行权限 chmod g-w <文件名> // 给用户组删除写权限 chmod o=r <文件名> // 给其他用户设置只读权限
|
同时,chmod 还支持数字表示法,其中每个权限对应一个数字:读(r)=4,写(w)=2,执行(x)=1。通过将这些数字相加,可以表示不同的权限组合。例如:
chmod 755 <文件名> // 设置权限为 rwxr-xr-x chmod 644 <文件名> // 设置权限为 rw-r--r-- chmod 700 <文件名> // 设置权限为 rwx------
|
Lyrics Shring
一叶轻船 一双月对半 一帘清梦悠悠醉意阑珊 移舟靠岸 案前唯剩空盏 莫怨良辰短 曲终了韵意未完
|
最后
本篇博客写于笔者操作系统课程学习期间,内容可能存在不完善之处,如果浪费了您宝贵的时间,笔者深表歉意。后续会继续更新完善,欢迎大家提出宝贵意见和建议。
Thanks for reading!