Linux学习笔记1

本文最后更新于:2023年11月12日 晚上

想说的话

本系列文章可能不会是你所期待的文章,在阅读的时候你可能会觉得该文章的问题包括但不限于:抽象、错误、跳跃,是因为我在写该系列文章的时候并没有像之前其他系列文章那样做。
该系列文章更多的是我对书中知识的大概概括。
阅读该系列文章可能会需要一定编程基础。
敬请谅解。

第一章 入门

./命令

例子:./hello
特别指示shell去执行当前目录下给定的名称的程序

gcc命令

-I + 位置
例子:gcc -I/usr/openwin/include fred.c
查找包含保存在子目录或非标准位置中的头文件

命令的简写

gcc -o fred fred.c /usr/lib/libm.a可以写成gcc -o fred fred.c -lm
l == lib, m == 函数库名,即:-l + 函数库名

-L + 位置

例子:gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11
为编译器增加库的搜索路径

-c

作用是阻止编译器创建一个完整的程序(一般情况下输出一个.o文件

ar程序

例子:ar crv libfoo.a bill.o fred.o
将若干单独的文件归并到一个大的文件中以创建归档文件或集合

grep命令

搜索包含某些特定定义和函数原型的头文件
例子:grep EXIT_ *.h
在当前目录下的所有以.h结尾的文件中搜索字符串EXIT_

nm命令

查看哪些函数被包含在目标文件、函数库或可执行文件里。

Linux和Windows环境下的文件格式区分

第一行为在Linux环境下对应的文件格式,第二行则是在Windows环境下产生的文件格式。

目标模块 静态函数库 程序
func.o lib.a program
FUNC.OBJ LIB.LIB PROGRAM.EXE

man命令

例子:man gcc
访问在线手册页,按空格键读下一页,按Enter/Return键读下一行,按q退出。

info命令

GNU软件使用的在线文档系统,按下Ctrl+H以获得帮助信息。

第二章 Shell程序设计

2.1 重定向输出

文件描述符0代表一个程序的标准输入,文件描述符1代表标准输出,2代表标准错误输出。

>操作符

例子:ls -l > lsoutput.txt
把命令的输出保存到文件中。如果文件已存在则覆盖,可使用命令set -o noclobberset -C设置noclobber选项,从而阻止重定向操作对一个已有文件的覆盖。可以使用set +o noclobber命令取消该选项。

>>操作符

例子:ps >> lsoutput.txt
把命令的输出附加到指定文件的尾部。

2>

例子:kill -HUP 1234 >killout.txt 2>killerr.txt
对标准错误输出进行重定向。当需要丢弃错误信息并阻止它显示在屏幕上时,这个方法很有用(比如一些错误无伤大雅,不需要弹框提示,但是应该把它写进去log)。
在上面的例子中,标准输出和标准错误输出分别被重定向到不同的文件中了。
kill -1 1234 >killouterr.txt 2>&1
两组输出都被重定向到一个文件中了。 >&操作符可以结合两个输出。

>/dev/null

例子:kill -l 1234 >/dev/null 2>&1
丢弃输出。

|操作符

例子:ps > psout.txt
你可以用管道操作符|来连接进程。
比如sort psout.txt > pssort.out可以写成:ps | sort > pssort.out

2.2 编写第一个脚本

假设现在我们已经编写好了一个脚本文件first,我们可以这样使用:/bin/sh first
看上去很麻烦,可以用chmod命令来改变这个文件的模式:chmod +x first
然后就可以使用first(配置过环境变量PATH)或者./first(推荐)执行了。

2.3 shell的语法

2.3.1 变量

创建变量:x=1(在默认情况下,所有变量都被看作字符串并以字符串来存储。shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。)
访问变量:通过在变量名前加一个$符号来访问它的内容。
例子:

1
2
3
$ salutation=Hello
$ echo $salutation
Hello

注意,如果字符串里包含空格,就必须用引号把它们括起来。此外,等号两边不能有空格。

read命令

例子:read salutation
将用户的输入赋值给一个变量。

引号的使用

变量在引号中的行为取决于你所使用的引号类型。如果把$变量表达式放在双引号中,程序执行到这一行时就会把变量替换为它的值;如果放在单引号中,就不会替换。在$前面加上一个\字符会取消$的特殊含义。

环境变量

当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化。下面列举一些主要的变量:

环境变量 说明
$HOME 当前用户的家目录
$PATH 以冒号分隔的用来搜索命令的目录列表
$PS1 命令提示符,通常是$字符,但在bash中,你可以使用一些更复杂的值。例如,字符串[\u@\h\W]$就是一个流行的默认值,它给出用户名、机器名和当前目录名,当然也包括一个$提示符
$PS2 二级提示符,用来提示后续的输入,通常是>字符
$IFS 输入域分隔符。当shell读取输入时,它给出用来分隔单词的一组字符,它们通常是空格、制表符和换行符
$0 shell脚本的名字
$# 传递给脚本的参数个数
$$ shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件如/tmp/tmpfile_$$

参数变量

如果脚本程序在调用时带有参数,一些额外的变量就会被创建。

即使没有传递任何参数,环境变量$#也依然存在,只不过它的值时0罢了。
例子:$ ./try_var foo bar baz

参数变量 说明
$1, $2, ... 脚本程序的参数
$* 在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。如果IFS被修改了,那么$#将命令行分割为参数的方式就将随之改变
$@ 它是$*的一种变体,它不使用IFS环境变量,所以即使IFS为空,参数也不会挤在一起

2.3.2 条件

test[命令

例子:检查一个文件是否存在

1
2
3
4
5
6
if test -f fred.c
then
...
else
...
fi

或者写成:

1
2
3
4
5
6
if [ -f fred.c ]
then
...
else
...
fi

注意要在[符号和被检查的条件之间留出空格。
可以把ifthen放在同一行:

1
2
3
if [ -f fred.c ]; then  
...
fi

test命令可以使用的条件类型可以归为三类:字符串比较、算数比较和与文件有关的条件测试。

2.3.3控制结构

if…elif…else语句

1
2
3
4
5
6
7
8
9
if condition
then
statements
elif condition
then
statements
else
statements
fi

for语句

我们可以用for结构来循环处理一组值,这组值可以是任意字符串的集合。

1
2
3
4
for variable in values
do
statements
done

例子:

1
2
3
4
5
for foo in bar fud 43
do
echo $foo
done
exit 0

while语句

1
2
3
4
while condition
do
statements
done

until语句

1
2
3
4
until condition
do
statements
done

这里有一只爱丽丝

希望本文章能够帮到您~


Linux学习笔记1
https://map1e-g.github.io/2022/10/04/linux-learning-1/
作者
MaP1e-G
发布于
2022年10月4日
许可协议