从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 | 给所有用户执行权限 |
脚本的权限通常设为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是一个脚本文件,word1、word2和word3是三个参数。
脚本文件内部,可以使用特殊变量,引用这些参数。
$0:脚本文件名,即script.sh。$1~`$9`:对应脚本的第一个参数到第九个参数。$#:参数的总数。$@:全部的参数,参数之间使用空格分隔。$*:全部的参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,但是可以自定义。
如果脚本的参数多于9个,那么第10个参数可以用${10}的形式引用,以此类推。shift命令可以改变脚本参数,每次执行都会移除脚本当前的第一个参数($1),使得后面的参数向前一位,即$2变成$1、$3变成$2、$4变成$3,以此类推。shift命令可以接受一个整数作为参数,指定所要移除的参数个数,默认为1。
注意,如果命令是command -o foo bar,那么-o是$1,foo是$2,bar是$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.txt1
cp file1.txt file2.txt
将
file1.txt、file2.txt文件复制到同目录下的file目录中1
cp file1.txt file2.txt ./file/
将
dir1文件夹及其所有子文件复制到同目录下的test文件夹中1
cp -r dir1 ./test/
mv 命令
mv 与 cp 的使用方式相似,效果类似于 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 | echo "Hello Linux!" > output_file # 将输出写入到文件(覆盖原有内容) |
无论是 > 还是 >>,当输出文件不存在时都会创建该文件。
重定向输入使用符号 <:
1 | command < inputfile |
参考资料
- 本文作者:Ivor Lin
- 本文链接:http://ivorlin.cn/%E7%8E%AF%E5%A2%83/2023/10-a283ebfe25c4/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!