Linux基础
常用文件管理命令
ctrl c
: 取消命令,并且换行ctrl u
: 清空本行命令tab
:可以补全命令和文件名,如果补全不了快速按两下tab键,可以显示备选选项ls
: 列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件。ls
后可以添加一些参数:-a
: 显示所有文件(包括包括隐藏文件)-s
: 显示文件大小-l
: 以长列表格式显示文件和目录-h
: 以人性化输出文件大小-R
: 遍历子目录
pwd
: 显示当前路径cd
路径: 进入路径目录下cd
默认返回家目录cd ..
返回上层目录
cp
路径1 路径2: copy,将路径1的内容复制一份到路径2处,包括复制+粘贴+重命名,比如:cp a/tmp.txt b
:复制a路径的tmp.txt到b路径cp a/tmp.txt b/tmp2.txt
:复制a路径的tmp.txt到b路径,并重命名为tmp2.txtcp a b -r
: 将a复制一份粘贴到b里面
mkdir
路径1: make directory,创建目录路径1。可以添加-p
创建一系列的文件夹:mkdir /home/acs/a/b
在根目录下创建文件mkdir a/b/c -p
在该文件夹下创建a/b/c复合文件
rm
XXX: remove,删除普通文件;rm *
可以删除当前目录下全部内容rm *.txt
可以删除当前目录下全部.txt内容
rm
XXX -r: 删除文件夹mv
路径1 路径2: move,将路径1的文件移动到路径2,(剪切+粘贴)mv a/tmp.txt b
:将路径a的tmp.txt文件移动到路径bmv a/tmp.txt b/tmp1.txt
:将将路径a的tmp.txt文件移动到路径b并重命名为tmp1.txtmv tmp2.txt tmp.txt
将tmp2.txt重命名为tmp.txt
touch
XXX: 创建一个文件cat
XXX: concatenate, 展示文件XXX中的内容- 复制文本: windows/Linux下:Ctrl + insert,Mac下:command + c
- 粘贴文本: windows/Linux下:Shift + insert,Mac下:command + v
rm /* -rf
(删除所有文件)
tmux
功能
- 分屏
- 允许断开Terminal连接后继续运行进程
结构
一个tmux
可以包含多个session
(会话),一个session
可以包含多个window
(窗口),一个window
可以包含多个pane
。
1 | tmux: |
操作
tmux
:新建一个session,其中包含一个window,window中包含一个pane,pane里打开了一个shell对话框
- 切分:
- 竖直切分:先按
ctrl+b
松开,再输入%
。按下ctrl+d
,可以关闭tmux
- 水平切分:先按
ctrl+b
,再输入"
.同样的按下ctrl+d
取消
- 竖直切分:先按
- 退出:
ctrl+d
退出;当window没有pane时,自动退出;当session没有window时,自动退出;故一直ctrl+d
下去会直接退出。 - 选择pane:鼠标点击即可或输入
ctrl+b
,然后按方向键选择相邻的pane - 调整分割线:选中并拖动即可或者
ctrl+b
同时(同时也不松开)按方向键。 - 全屏与取消全屏:某个窗口全屏:选中并按下
ctrl+b
再按z
同样取消按ctrl+b
再按z
- 挂起窗口:从
tmux
退出但不关闭。ctrl+b
然后按d
,此为从session中退出。输入tmux a 或tmux attach,再开启session窗口 - 选择其他的session:先进入tmux,然后在tmux里输入
ctrl+b
再按s
再在session里使用方向键操作:→
展开,→
再按一次是展开所有pane,←
按下是合上所有pane、←
合上、↑↓
选择session - session中创建window与选择window:
ctrl+b
再按c
:创建windowctrl+b
再按w
:选择其他window,也可以展开合上每个window
注:ctrl+b+s
与ctrl+b+w
的区别:前者打开只展开session一级,展示session级中所有的window,后者打开默认是w一级,展开window级中所有的pane。
- 翻阅内容:
↑
滚轮向上。如果没有鼠标:ctrl+b
再按Pageup向上翻,按PageUp向下翻。按PageUp也可以唤醒 - 从
tmux
中复制文本:按住shift
键选择文本ctrl+insert
复制,shift+insert
粘贴
vim
功能
- 命令行模式下的文本编辑器
- 根据扩展名判别编程语言,实现代码缩进、代码高亮
使用
vim +文件名
如果有该文件则打开,没有则打开一个新的文件,命名为输入的文件名
模式
- 一般命令模式/默认模式:无法编写,输入命令,每一个命令对应一个字母,支持复制粘贴删除文本
- 编辑模式:在默认模式下按
i
,进入编辑模式,按esc
退出 - 命令行模式:默认模式下按
:
或/
或?
三个中任意一个进入命令行模式,命令行在最下面(建议用:
)。支持查找、替换、保存、退出、配置编辑器等。输入:wq
,保存并退出。
操作
i
:进入编辑模式esc
:退出编辑模式,进入一般命令模式h
或←
:光标向左移动一个字符j
或↓
:光标向下移动一个字符k
或↑
:光标向上移动一个字符l
或→
:光标向右移动一个字符。注:在命令模式下:vim会卡在最后一个字符前面,编辑模式会卡在最后一个字符。- 光标的移动操作:
n<Space>
,n
是数字,光标会自动右移n
个字符。- 一般命令模式下,
0/home
将光标移动到本行开头,$/End
将光标移动到本行结尾。 G
:光标移动到最后一行。
- 移动到具体行:
n/nG
:表示想去具体到哪一行(n是到某一行的下面,nG是直达)gg
:到达第一行n<Enter>
向下跳n行。
- 查找与修改字符串:
/word
:在命令行模式下,光标之下寻找第一个值为word的字符串?word
:在光标之上第一个值为word的字符串n
:重复前一个查找操作N
:反向查找,也就是说前一个命令向前找,此命令下向后找:n1,n2s/word1/word2/g
:n1
,n2
为数字,在第n1
与n2
行之间找word1
,并替换为word2
:1,$s/word1/word2/g
: 将全文的word1
换成word2
:1,$s/word1/word2/gc
:在每一次替换的时候都会让用户进行确认
:noh
:关闭所查找的关键词的高亮- 选中与删除:
v
:选中文本,按两下esc取消d
:删除选中文本(其实有剪切的特性)dd
:删除整行
- 复制与粘贴:
y
:复制(文本)p
:在光标所处位置的下一行或下一个位置(通常当光标在两边时)粘贴yy
:复制当前行
- 撤销:
u
:撤销ctrl+r
:取消撤销
>
将选中的文本整体向右移动,<
将选中的文本整体向左移动- 保存与退出:
:w
保存:w!
强制保存- 一般命令模式下:按下
ESC
,按q
退出 :q!
强制退出(不保存):wq
保存并退出:wq!
强制保存退出
- 行号的显示与隐藏:
:set nonu
隐藏行号:set nu
显示行号
paste
模式:当要粘贴过来的代码很长时,命令可能会失效,占用很大带宽,导致出现多重缩进:set paste
取消代码缩进,设置成粘贴模式:set nopaste
开启代码缩进
gg+d+G
:删除全部内容,gg=G
:将全文格式化ctrl+q
:当vim
卡死时,可取消当前正在执行的命令- 异常处理:
- 当前进程出现冲突时的解决方法:找到正在多个打开的文件程序,并关掉,保证同一个进程只有同一个文件能打开
- 当一个进程不小心被其他进程杀掉,当再打开
main.cpp
时,此时如果出现一个.swp
缓存文件时会报错,解决方法:在没有任何一个进程打开该文件时,将.swp
文件删掉即可
shell
语法
概论
shell是通过命令行与操作系统沟通的语言。它既是一种命令语言,又是一种程序设计语言。
Linux中常见的shell脚本有很多种,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- zsh
- …
Linux系统中一般默认使用bash,文件开头需要写#! /bin/bash
,指明bash为脚本解释器。如果是python的话开头要写#! /usr/env/python
加了才能使用./filename.sh
或./filename.py
运行程序文件。
脚本示例
新建一个test.sh
文件,内容如下:
1 | ! /bin/bash |
运行方式
- 用解释器运行
1
bash test.sh
- 作为可执行文件
1
2
3acs@9e0ebfcd82d7:~$ chmod +x test.sh # 使脚本具有可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh # 当前路径下执行
Hello World! # 脚本输出
注释
单行注释
每行中#
之后的内容均是注释:
1 | 这是一行注释 |
多行注释
示例:
1 | :<<EOF |
其中EOF
可以换成其它任意字符串。例如:
1 | :<<abc |
或
1 | :<<! |
变量
定义变量
定义变量一般定义的是字符串,但当变量需要是整数时,会自动把变量转换成整数,可以使用双引号、单引号或不加引号,且等号左右不能加空格:
1 | name1="ep" |
使用变量
使用变量,需要加上 $
符号,或者 ${}
符号。花括号是可选的,主要为了帮助解释器识别变量边界。
1 | name=ep |
只读变量
使用readonly
或者 declare -r
可以将变量变为只读。
1 | name=ep |
删除变量
unset
可以删除变量
1 | name=ep |
变量类型
- 自定义变量(局部变量) 子进程不能访问的变量
- 环境变量(全局变量) 子进程可以访问的变量
自定义变量改成环境变量:
1 | acs@9e0ebfcd82d7:~$ name=ep # 定义变量 |
环境变量改为自定义变量:
1 | acs@9e0ebfcd82d7:~$ export name=name # 定义环境变量 |
字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号与双引号的区别:
- 单引号中的内容会原样输出,不会执行、不会取变量
- 双引号中的内容可以执行、可以取变量
1 | name=ep # 不用引号 |
获取字符串长度:
1 | name=ep |
1 | 2 |
提取子串:
1 | name=hello, ep |
1 | hello |
默认变量
文件参数变量
在执行 shell
脚本时,可以向脚本传递参数。
$1
是第一个参数,$2
是第二个参数,以此类推。特殊的,$0
是文件名(包含路径,其实就是我们输入的第一段,输入绝对路径就显示绝对路径,输入相对路径就显示相对路径)。例如:
1 | ! /bin/bash |
1 | ./test.sh |
其他参数相关变量:
参数 | 说明 |
---|---|
$(命令) | 获取一个命令的标准输出,如$(ls) |
$# |
代表文件传入的参数个数,如上例中值为2 |
$* |
由所有参数构成的用空格隔开的字符串,如上例中值为”$1 $2” |
$@ |
每个参数分别用双引号括起来的字符串,如上例中值为”$1” “$2” |
$$ |
脚本当前运行的进程ID |
$? |
上一条命令的退出状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误 |
$(command) |
返回command 这条命令的stdout(可嵌套) |
command |
返回command 这条命令的stdout(不可嵌套) |
数组
定义
数组下标从0开始,用小括号表示,元素之间用空格隔开:
1 | array=(1 abc "def" ep) |
也可以直接定义数组中某个元素的值:
1 | array[0]=1 |
读取数组元素
读取特定位置:
1 | {array[index]} |
例如:
1 | array=(1 abc "def" ep) |
读取整个数组:
1 | {array[@]} # 第一种写法 |
数组长度
类似于字符串:
1 | {#array[@]} # 第一种写法 |
expr命令
expr
命令用于求表达式的值,格式为:
1 | expr 表达式 |
expr
本身也有返回值:
1 | expr 3 + 4 |
expr
可以用$()
和``取返回值(stdout的结果)
1 | str="Hello World!" |
expr表达式说明
- 用空格隔开每一项
- 用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
- 对包含空格和其他特殊字符的字符串要用引号括起来
expr
会在stdout
中输出结果。如果为逻辑关系表达式,则结果为真,stdout
为 1,否则为 0。expr
的exit code
:如果为逻辑关系表达式,则结果为真,exit code
为0 ,否则为 1
字符串表达式
length STRING
: 返回STRING
的长度 (汉字长度为3)index STRING CHARSET
:CHARSET
中任意单个字符在STRING
中最前面的字符位置,下标从1 开始。 如果在STRING
中完全不存在CHARSET
中的字符,则返回0。(这里需要与字符串变量做区别,字符串变量下标是从0开始的)substr STRING POSITION LENGTH
: 返回STRING
字符串中从POSITION
开始,长度最大为LENGTH
的子串。 如果POSITION
或LENGTH
为负数,0 或非数值,则返回空字符串。(字符串下标从1开始,字符串变量的求子串下标从0开始)
1 | str="Hello World!" |
1 | 12 |
整数表达式
expr
支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。
注意:所有运算符号与变量或数字之间都要用空格隔开,否则将会被识别成字符串
如:
1 | a=2 |
1 | 2+3 |
+
、-
加减运算。两端参数会转换为整数,如果转换失败则报错。*
/
%
乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。()
可以改变优先级,但需要用反斜杠转义1
2
3
4
5
6
7
8
9a=3
b=4
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a / $b`
echo `expr $a % $b`
echo `expr \( $a + 1 \) \* \( $b + 1 \)`1
2
3
4
5
67
-1
12
0
3
20
逻辑关系表达式
逻辑关系表达式需要用单引号''
或者\
将运算符号转义。
|
如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值,但要求第二个参数的值也是非空或非0,否则返回0。如果第一个参数是非空或非0时,不会计算第二个参数。(短路原则:当前面的表达式为1时,就不用计算后面的表达式了)&
如果两个参数都非空且非0,则返回第一个参数,否则返回0。如果第一个参为0或为空,则不会计算第二个参数。(短路原则:当前面的表达式为0,时就不用计算后面的表达式了,若都为0则返回前面表达式的值)< <= = == != >= >
比较两端的参数,如果为true,则返回1,否则返回0。==
是=
的同义词。expr首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。()
可以该表优先级,但需要用反斜杠转义1
2
3
4
5
6
7
8
9
10
11
12
13
14
15a=3
b=4
echo `expr $a \> $b`
echo `expr $a '<' $b`
echo `expr $a '>=' $b`
echo `expr $a \<\= $b`
c=0
d=5
echo `expr $c \& $d`
echo `expr $a \& $b`
echo `expr $c \| $d`
echo `expr $a \| $b`1
2
3
4
5
6
7
80
1
0
1
0
3
5
3
read命令
read
命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code
为 1
,否则为0
。
参数:-p
: 后面可以接提示信息-t
:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令
1 | acs@9e0ebfcd82d7:~$ read name |
echo命令
echo
用于输出字符串。命令格式:
1 | echo STRING |
显示普通字符串
1 | echo "Hello World" |
显示转义字符
1 | echo "\"Hello World\"" # 注意只能使用双引号,如果使用单引号,则不转义 |
显示变量
1 | name=ep |
显示换行
1 | echo -e "Hi\n" # -e 开启转义 |
1 | Hi |