从Windows到Linux

前言和声明

随着专业的需求,Linux的使用率逐渐提高,开发应需要利用系统的优势,学习开发相关的丰富功能以提高工作效率。

本文章是以后续回头看为出发点进行的笔记整理,因此不会解释文字间的关联性,这篇文章也只是“重新梳理”形式的转载,知识深度也谈不上原创,内容源自参考资料

命令行

最基本操作

  • ls 命令:列出(list)目录的内容(默认情况下是当前目录),包括文件和其他嵌套目录;

  • cd 命令:切换目录(change directory),其中 cd - 返回上一个目录;

  • man 命令:用于查看各种命令、函数和配置文件的手册(manual)页面;

  • mkdir命令:用于创建目录(make directory);

  • chmod命令:控制用户对文件的权限的命令(change mode),例:chmod a+x file给file的所有用户增加执行权限;

  • rm命令:用于删除(remove)某个文件或者目录。

快捷键

  • Ctrl + L:清除屏幕并将当前行移到页面顶部。
  • Ctrl + C:中止当前正在执行的命令。
  • Shift + PageUp:向上滚动。
  • Shift + PageDown:向下滚动。
  • Ctrl + U:从光标位置删除到行首。
  • Ctrl + K:从光标位置删除到行尾。
  • Ctrl + W:删除光标位置前一个单词。
  • Ctrl + D:关闭 Shell 会话。
  • :浏览已执行命令的历史记录。

Bash脚本

Bash 是 Linux 和 Mac 的默认 Shell(命令行环境)。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Bash 本身内置了很多命令,同时也可以执行外部程序。可以使用type命令判断命令的来源。

系统教程:Bash 脚本教程 - 网道 (wangdoc.com)

脚本文件的新建和初始化

指定解释器

脚本的第一行通常是指定解释器,即这个脚本必须通过什么解释器执行。这一行以#!字符开头,这个字符称为 Shebang,所以这一行就叫做 Shebang 行。
#!/bin/bash告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

权限和指定路径

只要指定了 Shebang 行的脚本,可以直接执行。这有一个前提条件,就是脚本需要有执行权限。可以使用下面的命令,赋予脚本执行权限。

1
2
3
4
5
6
7
8
9
10
# 给所有用户执行权限
$ chmod +x script.sh

# 给所有用户读权限和执行权限
$ chmod +rx script.sh
# 或者
$ chmod 755 script.sh

# 只给脚本拥有者读权限和执行权限
$ chmod u+rx script.sh

脚本的权限通常设为755(拥有者有所有权限,其他人有读和执行权限)或者700(只有拥有者可以执行)。

除了执行权限,脚本调用时,一般需要指定脚本的路径(比如path/script.sh)。如果将脚本放在环境变量$PATH指定的目录中,就不需要指定路径了。因为 Bash 会自动到这些目录中,寻找是否存在同名的可执行文件。

建议在主目录新建一个~/bin子目录,专门存放可执行脚本,然后把~/bin加入$PATH

1
export PATH=$PATH:~/bin

上面命令改变环境变量$PATH,将~/bin添加到$PATH的末尾。可以将这一行加到~/.bashrc文件里面,然后重新加载一次.bashrc,这个配置就可以生效了。

1
source ~/.bashrc

以后不管在什么目录,直接输入脚本文件名,脚本就会执行。

1
script.sh

上面命令没有指定脚本路径,因为script.sh$PATH指定的目录中。

格式和命令策略

分号(;)是命令的结束符,使得一行可以放置多个命令;

Bash 通过两个命令组合符&&||,实现命令的逻辑短路,允许更好地控制多个命令之间的继发关系。

1
Command1 && Command2

上面命令的意思是,如果Command1命令运行成功,则继续运行Command2命令。

1
Command1 || Command2

上面命令的意思是,如果Command1命令运行失败,则继续运行Command2命令。

模式匹配

  • ~ 会扩展成当前用户的主目录。

  • 一些具有正则表达式性质的字符也可以视为拓展:

    • ? 字符代表文件路径里面的任意单个字符,不包括空字符('')。

    • * 字符代表文件路径里面的任意数量的任意字符(可以匹配空字符),包括零个字符。
      如果要匹配隐藏文件,同时要排除...这两个特殊的隐藏文件,可以与方括号扩展结合使用,写成.[!.]*

      1
      echo .[!.]*

转义字符

Bash 只有一种数据类型,就是字符串。因此,字符串相关的引号和转义,对 Bash 来说就非常重要。

某些字符在 Bash 里面有特殊含义(比如$&*\)。如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠\,使其变成普通字符。这就叫做“转义”(escape)。

换行符是一个特殊字符,表示命令的结束,Bash 收到这个字符以后,就会对输入的命令进行解释执行。换行符前面加上反斜杠\转义,就使得换行符变成一个普通字符,Bash 会将其当作长度为0的空字符处理,从而可以将一行命令写成多行。

引号

Bash 允许字符串放在单引号或双引号之中,加以引用。

单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(*)、美元符号($)、反斜杠(\)等。

双引号比单引号宽松,大部分特殊字符在双引号里面,都会失去特殊含义,变成普通字符。
可以利用双引号中的换行符,在命令行输入多行文本。
双引号的另一个常见的使用场合是文件名包含空格。

但是,这三个字符在双引号之中除外,依然有特殊含义,会被 Bash 自动扩展:

  • 美元符号($):引用变量
  • 反引号( ` ):执行子命令
  • 反斜杠(\

脚本参数

调用脚本的时候,脚本文件名后面可以带有参数。

1
$ script.sh word1 word2 word3

上面例子中,script.sh是一个脚本文件,word1word2word3是三个参数。

脚本文件内部,可以使用特殊变量,引用这些参数。

  • $0:脚本文件名,即script.sh
  • $1~`$9`:对应脚本的第一个参数到第九个参数。
  • $#:参数的总数。
  • $@:全部的参数,参数之间使用空格分隔。
  • $*:全部的参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,但是可以自定义。

如果脚本的参数多于9个,那么第10个参数可以用${10}的形式引用,以此类推。
shift命令可以改变脚本参数,每次执行都会移除脚本当前的第一个参数($1),使得后面的参数向前一位,即$2变成$1$3变成$2$4变成$3,以此类推。shift命令可以接受一个整数作为参数,指定所要移除的参数个数,默认为1

注意,如果命令是command -o foo bar,那么-o$1foo$2bar$3

常见命令

echo 命令

作用是在屏幕输出文本,可以将该命令的参数原样输出。

参数
  • -n 取消末尾的回车符
  • -e 参数会解释引号(双引号和单引号)里面的特殊字符(比如换行符\n

alias 命令

在shell会话中定义临时别名。创建别名时,您指示shell用一系列命令替换单词。
例如,要设置 ls 为颜色而不每次键入标志 --color,您将使用:

1
alias ls="ls --color=auto"

只键入命令alias可以列出shell会话中所有的别名。

unalias命令旨在从已定义的别名中删除alias。要删除以前的ls别名,可以使用:

1
unalias ls

source 命令

用于执行一个脚本,通常用于重新加载一个配置文件。

source命令最大的特点是在当前 Shell 执行脚本,不像直接执行脚本时,会新建一个子 Shell。所以,source命令执行脚本时,不需要export变量。

文件操作

cat 命令

cat 是 concatenate(连接)的缩写,其实际的功能是连接多个文件,然后输出。但是当只有一个文件的时候,cat 就会直接输出这个文件,所以 cat 最常见的用途就是输出单个文件。

输出操作示例
  • 输出 file.txt 的全部内容

    1
    cat file.txt
  • 查看 file1.txt 与 file2.txt 连接后的内容

    1
    cat file1.txt file2.txt

cp 命令

复制(copy)文件和目录。

复制操作示例
  • file1.txt 复制一份到同目录,命名为 file2.txt

    1
    cp file1.txt file2.txt
  • file1.txtfile2.txt 文件复制到同目录下的 file 目录中

    1
    cp file1.txt file2.txt ./file/
  • dir1 文件夹及其所有子文件复制到同目录下的 test 文件夹中

    1
    cp -r dir1 ./test/

mv 命令

mvcp 的使用方式相似,效果类似于 Windows 下的剪切/移动。

touch 命令

创建文件:touch FILE_NAME...

find 命令

在 PATH(路径)中根据 EXPRESSION(表达式)搜索文件:

1
find [OPTION] PATH [EXPRESSION]
常用的表达式
选项 含义
-name '*.ext' 文件名后缀为 ext。其中 * 是任意匹配符
-type d 文件类型为目录,其他的类型例如 f(普通文件)
-size +1M 大于 1M 的文件,+ 代表大于这个大小,对应地,- 代表小于之后的大小
-or 或运算符,代表它前后两个条件满足一个即可

进程控制

查看进程

ps命令用于显示当前进程的状态(process status),类似于 windows 的任务管理器。

常见参数及其解释
  • -A 列出所有的进程

  • -w 显示加宽可以显示较多的资讯

  • -au 显示较详细的资讯

  • -aux 显示所有包含其他使用者的进程

  • au(x) 输出格式 :

    1
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    • USER : 行程拥有者
    • PID : pid
    • %CPU : 占用的 CPU 使用率
    • %MEM : 占用的记忆体使用率
    • VSZ : 占用的虚拟记忆体大小
    • RSS : 占用的记忆体大小
    • TTY : 终端的次要装置号码 (minor device number of tty)
    • STAT : 该行程的状态 :
      • D : 无法中断的休眠状态 (通常 IO 的进程)
      • R : 正在执行中
      • S : 静止状态
      • T : 暂停执行
      • Z : 不存在但暂时无法消除
      • W : 没有足够的记忆体分页可分配
      • < : 高优先序的行程
      • N : 低优先序的行程
      • L : 有记忆体分页分配并锁在记忆体内
    • START : 行程开始时间
    • TIME : 执行的时间
    • COMMAND :所执行的指令

删除进程

kill 命令用于删除执行中的程序或工作。

kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。

其语法为:

1
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

参数说明

  • -l <信息编号> 若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
  • -s <信息名称或编号> 指定要送出的信息。
  • [程序] 可以是程序的PID或是PGID,也可以是工作编号。

最常用的信号是:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

数据处理

数值化处理命令

sort 命令

用于文本的行排序。默认排序方式是升序,按每行的字典序排序。

一些基本用法:

  • -r 降序(从大到小)排序
  • -u 去除重复行
  • -o [file] 指定输出文件
  • -n 用于数值排序,否则“15”会排在“2”前

uniq 命令

用来排除重复的行,但是仅对连续的重复行生效。

通常会和 sort 一起使用:

1
$ sort animals | uniq

只是去重排序可以用 sort -u ,实际上 uniq 还有其他用途:

  • uniq -d 可以用于仅输出重复行:

    1
    $ sort animals | uniq -d
  • uniq -c 可以用于统计各行重复次数:

    1
    $ sort animals | uniq -c

文本处理命令

grep 命令

grep 全称 Global Regular Expression Print,是一个强大的文本搜索工具,可以在一个或多个文件中搜索指定 pattern 并显示相关行。

命令格式:grep [option] pattern file

一些用法:

  • -n:显示匹配到内容的行号
  • -v:显示不被匹配到的行
  • -i:忽略字符大小写

正则表达式

正则表达式通常以(尽管并不总是) /开始和结束。常见的“转义字符”有:

特殊字符 描述
[] 方括号表达式,表示匹配的字符集合,例如 [0-9][abcde]
() 标记子表达式起止位置
* 匹配前面的子表达式零或多次
+ 匹配前面的子表达式一或多次
? 匹配前面的子表达式零或一次
\ 转义字符,除了常用转义外,还有:\b 匹配单词边界;\B 匹配非单词边界等
. 匹配除 \n(换行)外的任意单个字符
{} 标记限定符表达式的起止。例如 {n} 表示匹配前一子表达式 n 次;{n,} 匹配至少 n 次;{n,m} 匹配 n 至 m 次
` `
$ 匹配字符串的结尾
^ 匹配字符串的开头,在方括号表达式中表示不接受该方括号表达式中的字符集合

I/O重定向

一般情况下命令从标准输入(stdin)读取输入,并输出到标准输出(stdout),默认情况下两者都是你的终端。使用重定向可以让命令从文件读取输入/输出到文件。下面是以 echo 为例的重定向输出:

1
2
3
4
5
6
7
8
9
10
$ echo "Hello Linux!" > output_file # 将输出写入到文件(覆盖原有内容)
$ cat output_file
Hello Linux!
$ echo "rewrite it" > output_file
$ cat output_file # 可以看到原来的 Hello Linux! 被覆盖了。
rewrite it
$ echo "append it" >> output_file # 将输出追加到文件(不会覆盖原有内容)
$ cat output_file
rewrite it
append it

无论是 > 还是 >>,当输出文件不存在时都会创建该文件。

重定向输入使用符号 <

1
2
command < inputfile
command < inputfile > outputfile

参考资料