Linux 初级自学入门【蓝桥Linux初级笔记】持续更新ing

  • Post author:
  • Post category:linux


常用快捷键:(开始学习之前,先了解一下一些常用的快捷键)

Ctrl + c 结束

tab 补全


一、Linux基本概念

有关Linux的历史以及其与Unix的渊源,这里就不赘述了,毕竟只是一个自存复习用的学习笔记。

通配符:

man 帮助手册

页面基本布局:


NAME(名称)


SYNOPSIS(概要)


DESCRIPTION(说明)


EXAMPLES(示例)


SEE ALSO(参见)

相关命令或函数的列表。

也可能存在其它部分内容,但这些部分没有得到跨手册页的标准化。常见的例子包括:OPTIONS(选项),EXIT STATUS(退出状态),ENVIRONMENT(环境),BUGS(程序漏洞),FILES(文件),AUTHOR(作者),

REPORTING BUGS(已知漏洞)

,HISTORY(历史)和 COPYRIGHT(版权)。

如果你知道某个命令的作用,只是想快速查看一些它的某个具体参数的作用,那么你可以使用

--help

参数

你可以在 man 中使用搜索

/<你要搜索的关键字>

,查找完毕后你可以使用

n

键切换到下一个关键字所在处,

shift+n

为上一个关键字所在处。


二、用户及文件权限管理

创建用户

su,su- 与 sudo

现在我们新建一个叫

lilei

的用户:

sudo adduser lilei

这个命令不但可以添加用户到系统,同时也会默认为新用户在 /home 目录下创建一个工作目录:


adduser



useradd

的区别是什么?

答:

useradd

只创建用户,不会创建用户密码和工作目录,创建完了需要使用

passwd <username>

去设置新用户的密码。

adduser

在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。其实

useradd



userdel

这类操作更像是一种命令,执行完了就返回。而

adduser

更像是一种程序,需要你输入、确定等一系列操作。

现在你已经创建好一个用户,并且你可以使用你创建的用户登录了,使用如下命令

切换登录用户

su -l lilei

退出当前用户跟退出终端一样,可以使用

exit

命令或者使用快捷键

Ctrl+D

用户组

用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源,就跟家的形式差不多。当然一个用户是可以属于多个用户组的,正如你既属于家庭,又属于学校或公司。

在 Linux 里面如何知道自己属于哪些用户组呢?

方法一:使用 groups 命令

groups shiyanlou

默认情况下在 sudo 用户组里的可以使用 sudo 命令获得 root 权限。shiyanlou 用户也可以使用 sudo 命令,为什么这里没有显示在 sudo 用户组里呢?可以查看下

/etc/sudoers.d/shiyanlou

文件,我们在

/etc/sudoers.d

目录下创建了这个文件,从而给 shiyanlou 用户赋予了 sudo 权限:

方法二:查看

/etc/group

文件

cat /etc/group | sort


| sort

表示将读取的文本进行一个字典排序再输出


/etc/group

文件格式说明

/etc/group 的内容包括用户组(Group)、用户组口令、GID(组 ID) 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:

group_name:password:GID:user_list

你看到上面的 password 字段为一个

x

,并不是说密码就是它,只是表示密码不可见而已。

默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入 sudo 用户组从而获取 root 权限

使用

usermod

命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令。

groups lilei
sudo usermod -G sudo lilei
groups lilei

删除用户组

sudo deluser lilei --remove-home

使用

--remove-home

参数在删除用户时候会一并将该用户的工作目录一并删除。如果不使用那么系统会自动在 /home 目录为该用户保留工作目录。

删除用户组可以使用

groupdel

命令,倘若该群组中仍包括某些用户,则必须先删除这些用户后,才能删除群组。

查看文件权限

使用较长格式列出文件: ls -l

  • 文件类型:关于文件类型,这里有一点你必需时刻牢记

    Linux 里面一切皆文件

    ,正因为这一点才有了设备文件(

    /dev

    目录下有各种设备文件,大都跟具体的硬件设备相关)这一说。
  • 文件权限:ls -alh 可以查看文件所有者
  • 文件大小:

    以 inode 结点大小为单位来表示的文件大小,你可以给 ls 加上

    -lh

    参数来更直观的查看文件的大小。

使用以下命令变更文件所有者为 shiyanlou

# 需要切换到 shiyanlou 用户执行以下操作
cd /home/lilei
ls iphone11
sudo chown shiyanlou iphone11

修改文件权限

———

三、目录结构即文件基本操作

目录结构

Linux其中大部分目录结构是规定好了的(FHS 标准),是死的,当你掌握后,你在里面的一切操作都会变得井然有序。

FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态,如下表所示:

目录路径

在 Linux 里面使用

.

表示当前目录,

..

表示上一级目录;~表示当前用户的home目录

比如你可以使用:

cd ..//返回上一级目录
cd ~ //进入当前登陆用户的home目录

绝对路径

关于绝对路径,简单地说就是


以根” / “目录为起点


的完整路径,以你所要到的目录为终点,表现形式如:

/usr/local/bin

,表示根目录下的

usr

目录中的

local

目录中的

bin

目录。

文件基本操作

新建空白文件:touch

新建目录: mkdir(使用

-p

参数,同时创建父目录)

复制文件:cp

删除文件:rm

三、环境变量与文件查找

创建、读取自定义变量

使用

declare

命令创建一个变量名为 tmp 的变量:

declare tmp

使用

=

号赋值运算符,将变量 tmp 赋值为 shiyanlou。

注意,与其他语言不同的是, Shell 中的赋值操作,

=

两边不可以输入空格,否则会报错。

读取变量的值,使用

echo

命令和

$

符号



$ 符号用于表示引用一个变量的值,初学者经常忘记输入

):

echo $tmp


注意:并不是任何形式的变量名都是可用的,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。

什么是环境变量?

环境变量的作用域比自定义变量的要大,如 Shell 的环境变量

作用于自身和它的子进程

。默认情况下,当一个进程被创建时,它将继承其父进程的绝大部分环境设置。

Shell 程序也作为一个进程

运行在操作系统之上,而我们在 Shell 中运行的

大部分命令都将以 Shell 的子进程的方式运行

通常我们会涉及到的变量类型有三种:

  • 当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。
  • Shell 本身内建的变量。
  • 从自定义变量导出的环境变量。

也有三个与上述三种环境变量相关的命令:

set



env



export

。(这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同):

命 令 说 明

set
显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。

env
显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。

export
显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。

(Notation: 这里bash是Linux默认打开的shell,其实还有很多其他的shell种类,比如zsh)

临时的:使用 export 命令行声明即可,当你关机后,或者关闭当前的 shell 之后,这种环境变量就没了。

如果想要添加一个永久生效的环境变量,只需要打开

/etc/profile

,在最后加上你想添加的环境变量

创建一个最简单的可执行 Shell 脚本

下面我们将练习创建一个最简单的可执行 Shell 脚本和一个使用 C 语言创建的“ hello world ”程序

1.创建一个 Shell 脚本文件

,你可以使用 gedit,vim,sublime 等工具编辑。(nano也是一个最简单的编辑器)

touch hello_shell.sh
gedit hello_shell.sh

在编辑器里面输入:

#!/bin/bash

for ((i=0; i<10; i++));do
    echo "hello shell"
done

exit 0


注意:在这一段脚本中,#!/bin/Bash这一句是个例外,他并不是注释,是标识,说明以下语句是Shell脚本

退出并保存之后,回到终端中,输入:为文件添加可执行权限,否则执行会报错没有权限:

chmod 755 hello_shell.sh

然后直接执行脚步即可: ./hello_shell.sh

2.创建一个 C 语言

hello world

程序

gedit hello_world.c

#include <stdio.h>

int main(void)
{
    printf("hello world!\n");
    return 0;
}

gcc -o hello_world hello_world.c


gcc 生成二进制文件默认具有可执行权限,不需要修改。

变量删除

可以使用

unset

命令删除一个环境变量:


source

命令

前面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的

.zshrc

),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用

source

命令来让其立即生效,如:

cd /home/shiyanlou
source .zshrc


source

命令还有一个别名就是

.

,上面的命令如果替换成

.

的方式就该是:

. ./.zshrc

在使用

.

的时候,需要注意与表示当前路径的那个点区分开。

注意第一个点后面有一个空格,而且后面的文件必须指定完整的绝对或相对路径名,

source

则不需要。

搜索文件


  • whereis

    简单快速


whereis

只能搜索二进制文件(

-b

),man 帮助文件(

-m

)和源代码文件(

-s

)。如果想要获得更全面的搜索结果可以使用

locate

命令。


  • locate

    快而全

注意这个命令也不是内置的命令,在部分环境中需要手动安装,然后执行更新。

sudo apt-get update
sudo apt-get install locate
sudo updatedb

  • which

    小而精


which

本身是 Shell 内建的一个命令,我们通常使用

which

来确定是否安装了某个指定的程序,我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。


  • find

    精而细


    注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path][option] [action] 。


find

应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。

四、文件打包与压缩

  • zip 命令
  • tar 命令
  • 压缩与解压常用组合

五、文件系统操作与磁盘管理


  • df



    du



    mount

    命令的使用
  • 磁盘相关知识学习

六、Linux下的帮助命令

  • 内建命令与外部命令之分
  • help,man,info 命令的使用以及区别

七、 Linux 系统的计划工具Crontab

  • crontab 语法

八、命令执行顺序的控制 与 管道


  • cut



    grep



    wc



    sort

    命令的使用
  • 管道的理解
  • 顺序执行、选择执行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧

通常情况下,我们每次只能在终端输入一条命令,按下回车执行,执行完成后,我们再输入第二条命令,然后再按回车执行。当有时候我们会一次输入多条命令,这个时候的执行过程又是如何的呢?下面我们将为大家详细讲解下命令的执行顺序的控制问题。

顺序执行

简单的顺序执行你可以使用

;

来完成;但是这种方法效率很低,有可能你等六很长的运行时间最后得到一个错误的结果。

选择执行

那么我们需要能够有选择性的来执行命令,比如上一条命令执行成功才继续下一条,或者不成功又该做出其它什么处理,比如我们使用

which

来查找是否安装某个命令,如果找到就执行该命令,否则什么也不做:

which cowsay>/dev/null && cowsay -f head-in ohch~

上面的

&&

就是用来实现选择性执行的,它表示


如果前面的命令执行结果返回 0


则执行后面的,否则不执行,你可以



$?

环境变量获取上一次命令的返回结果

echo $?

在 C 语言里面

&&

表示逻辑与,而且还有一个

||

表示逻辑或,同样 Shell 也有一个

||

,它们的区别就在于,shell 中的这两个符号除了也可用于表示逻辑与和或之外,就是可以实现这里的命令执行顺序的简单控制。

||

在这里就是与

&&

相反的控制效果,当上一条命令执行结果为

≠0(\$?≠0)

时则执行它后面的命令:

管道

管道是一种通信机制,通常用于进程间的通信(也可通过 socket 进行网络通信),它表现出来的形式就是

将前面每一个进程的输出

(stdout)直接作为

下一个进程的输入

(stdin)。(中间用|来分隔)

管道又分为匿名管道和具名管道

我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由

|

分隔符表示

试用

先试用一下管道,比如查看

/etc

目录下有哪些文件和目录,使用

ls

命令来查看:

ls -al /etc

发现有太多内容,屏幕不能完全显示,这时候

可以使用滚动条或快捷键滚动窗口来查看。不过这时候可以使用管道:

ls -al /etc | less

通过管道


将前一个命令(

ls

)的输出


作为

下一个命令(

less

)的输入

,然后就可以一行一行地看。

cut 命令,打印每一行的某一字段


grep

命令

wc 命令,简单小巧的计数工具

sort 排序命令

uniq 去重命令

九、简单的文本处理

这一节我们将介绍这几个命令

tr

(注意不是 tar),

col



join



paste

。实际这一节是上一节关于能实现管道操作的命令的延续,所以我们依然将结合管道来熟悉这些命令的使用。

  • 常见文本处理命令
  • 如何简单处理文本

tr 命令

可以用来删除一段文本信息中的某些文字。或者将其进行转换。

使用方式

tr [option]...SET1 [SET2]

常用的选项有

选项 说明

-d
删除和 set1 匹配的字符,注意不是全词匹配也不是按字符顺序匹配

-s
去除 set1 指定的在输入文本中连续并重复的字符

col 命令

可以将

Tab

换成对等数量的空格键,或反转这个操作。

使用方式

col [option]

常用的选项有

选项 说明

-x


Tab

转换为空格

-h
将空格转换为

Tab

(默认选项)

join命令

这个命令就是用于将两个文件中包含相同内容的那一行合并在一起。

使用方式

join [option]... file1 file2

常用的选项有

选项 说明

-t
指定分隔符,默认为空格

-i
忽略大小写的差异

-1
指明第一个文件要用哪个字段来对比,默认对比第一个字段

-2
指明第二个文件要用哪个字段来对比,默认对比第一个字段


paste

命令



join

命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以

Tab

隔开。

使用方式

paste [option] file...

常用的选项有

选项 说明

-d
指定合并的分隔符,默认为 Tab

-s
不合并到一行,每个文件为一行

十、数据流重定向

  • 重定向怎么用
  • 文件描述符(0,1,2)


>



>>

操作,他们分别是将标准输出导向一个文件或追加到一个文件中。这其实就是重定向,将原本输出到标准输出的数据重定向到一个文件中,因为标准输出(

/dev/stdout

)本身也是一个文件,我们将命令输出导向另一个文件自然也是没有任何问题的。

简单的重定向

Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为

stdin

(标准输入,对应于你在终端的输入),

stdout

(标准输出,对应于终端的输出),

stderr

(标准错误输出,对应于终端的输出)。

文件描述符 设备文件 说明

0

/dev/stdin
标准输入

1

/dev/stdout
标准输出

2

/dev/stderr
标准错误

初学者这里要注意不要将管道和重定向混淆,

管道默认是连接前一个命令的输出到下一个命令的输入

,而重定向通常是需要一个文件来建立两个命令的连接

标准错误重定向

使用 tee 命令同时重定向到多个文件

使用

exec

命令实现永久重定向

你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到永久有效呢?

我们可以使用

exec

命令实现永久重定向。

exec

命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:

# 先开启一个子 Shell
zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
ls
exit
cat somefile

创建输出文件描述符

在 Shell 中有 9 个文件描述符。上面我们使用了也是它默认提供的 0,1,2 号文件描述符。另外我们还可以使用 3-8 的文件描述符,只是它们默认没有打开而已

你可以使用下面命令查看当前 Shell 进程中打开的文件描述符:

cd /dev/fd/;ls -Al

同样使用

exec

命令可以创建新的文件描述符:

zsh
exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
echo "this is test" >&3
cat somefile
exit

关闭文件描述符

exec 3>&-
cd /dev/fd;ls -Al;cd -

完全屏蔽命令的输出

在 Linux 中有一个被称为黑洞的设备文件,所有导入它的数据都将被吞噬。

在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个 EOF。

我们可以利用

/dev/null

屏蔽命令的输出:

cat Documents/test.c 1>/dev/null 2>&1

上面这样的操作将使你得不到任何输出结果。

使用 xargs 分割参数列表

它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如

find



locate



grep

的结果,详细用法请参看 man 文档。

cut -d: -f1 < /etc/passwd | sort | xargs echo

上面这个命令用于将

/etc/passwd

文件按

:

分割取第一个字段排序后,使用

echo

命令生成一个列表。

十一、正则表达式基础

  • 掌握基本命令:

    sed



    grep



    awk

    的用法
  • 掌握正则表达式符号和语法

十二、Linux进程的概念

【附录一】基础命令总结

cd 更改路径

pwd 查看当前所在路径

touch 创建一个空白文件

ls 查看当前路径下的文件

man 帮助手册

who am i (who -m)或者 who mom likes 查看用户:

输出的第一列表示打开当前伪终端的用户的用户名;

第二列的

pts/0



pts

表示伪终端,所谓伪是相对于

/dev/tty

设备而言的;

你可以尝试再打开一个终端,然后在里面输入

who am i

,看第二列是不是就变成

pts/1

了;

第三列则表示当前伪终端的启动时间

如果去掉空格—> whoami 则只显示用户名

groups (其中冒号之前表示用户,后面表示该用户所属的用户组。)

cat (用于读取指定文件的内容并打印到终端输出

sudo passwd +<name>

mkdir

cp

【附录二】有趣的Linux小命令:

1.可以输出图形字符的命令

banner:


首先安装:

sudo apt-get update
sudo apt-get install sysvbanner

然后尝试:

banner CSDN

2.安装Xeyes

3.实现黑客帝国中的“数字雨”:

先安装:

sudo apt-get update
sudo apt-get install cmatrix

执行:cmatrix

(装好之后先不要急着执行,为了看到更好的效果,我们需要先修改终端的主题配色,在终端上面菜单栏中找到[首选项]修改,修改颜色预设为黑底绿字。)

题外话:在 macOS Unix 发行版中安装 cmatrix

键入下列命令:

$ brew install cmatrix

高清效果如下:

还可以改变代码的颜色:

cmatrix -C red



版权声明:本文为qq_48159150原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。