常用文件管理命令

  1. ctrl c: 取消命令,并且换行
  2. ctrl u: 清空本行命令
  3. tab:可以补全命令和文件名,如果补全不了快速按两下tab键,可以显示备选选项
  4. ls: 列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件。ls后可以添加一些参数:
    • -a : 显示所有文件(包括包括隐藏文件)
    • -s : 显示文件大小
    • -l : 以长列表格式显示文件和目录
    • -h : 以人性化输出文件大小
    • -R : 遍历子目录
  5. pwd: 显示当前路径
  6. cd 路径: 进入路径目录下
    • cd默认返回家目录
    • cd .. 返回上层目录
  7. 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.txt
    • cp a b -r: 将a复制一份粘贴到b里面
  8. mkdir 路径1: make directory,创建目录路径1。可以添加-p创建一系列的文件夹:
    • mkdir /home/acs/a/b 在根目录下创建文件
    • mkdir a/b/c -p 在该文件夹下创建a/b/c复合文件
  9. rm XXX: remove,删除普通文件;
    • rm *可以删除当前目录下全部内容
    • rm *.txt可以删除当前目录下全部.txt内容
  10. rm XXX -r: 删除文件夹
  11. mv 路径1 路径2: move,将路径1的文件移动到路径2,(剪切+粘贴)
    • mv a/tmp.txt b:将路径a的tmp.txt文件移动到路径b
    • mv a/tmp.txt b/tmp1.txt:将将路径a的tmp.txt文件移动到路径b并重命名为tmp1.txt
    • mv tmp2.txt tmp.txt 将tmp2.txt重命名为tmp.txt
  12. touch XXX: 创建一个文件
  13. cat XXX: concatenate, 展示文件XXX中的内容
  14. 复制文本: windows/Linux下:Ctrl + insert,Mac下:command + c
  15. 粘贴文本: windows/Linux下:Shift + insert,Mac下:command + v
  16. rm /* -rf (删除所有文件)

tmux

功能

  1. 分屏
  2. 允许断开Terminal连接后继续运行进程

结构

一个tmux可以包含多个session(会话),一个session可以包含多个window(窗口),一个window可以包含多个pane

1
2
3
4
5
6
7
8
9
10
11
12
13
tmux:
session 0:
window 0:
pane 0
pane 1
pane 2
...
window 1
window 2
...
session 1
session 2
...

操作

tmux:新建一个session,其中包含一个window,window中包含一个pane,pane里打开了一个shell对话框

  1. 切分:
    • 竖直切分:先按ctrl+b松开,再输入%。按下ctrl+d,可以关闭tmux
    • 水平切分:先按ctrl+b,再输入".同样的按下ctrl+d取消
  2. 退出:ctrl+d退出;当window没有pane时,自动退出;当session没有window时,自动退出;故一直ctrl+d下去会直接退出。
  3. 选择pane:鼠标点击即可或输入ctrl+b,然后按方向键选择相邻的pane
  4. 调整分割线:选中并拖动即可或者ctrl+b同时(同时也不松开)按方向键。
  5. 全屏与取消全屏:某个窗口全屏:选中并按下ctrl+b再按z
    同样取消按ctrl+b再按z
  6. 挂起窗口:从tmux退出但不关闭。ctrl+b然后按d,此为从session中退出。输入tmux a 或tmux attach,再开启session窗口
  7. 选择其他的session:先进入tmux,然后在tmux里输入ctrl+b再按s
    再在session里使用方向键操作:展开,再按一次是展开所有pane,按下是合上所有pane、合上、↑↓选择session
  8. session中创建window与选择window:ctrl+b再按c:创建window
    ctrl+b再按w:选择其他window,也可以展开合上每个window

注:ctrl+b+sctrl+b+w的区别:前者打开只展开session一级,展示session级中所有的window,后者打开默认是w一级,展开window级中所有的pane。

  1. 翻阅内容:滚轮向上。如果没有鼠标:ctrl+b再按Pageup向上翻,按PageUp向下翻。按PageUp也可以唤醒
  2. tmux中复制文本:按住shift键选择文本ctrl+insert复制,shift+insert粘贴

vim

功能

  1. 命令行模式下的文本编辑器
  2. 根据扩展名判别编程语言,实现代码缩进、代码高亮

使用

vim +文件名

如果有该文件则打开,没有则打开一个新的文件,命名为输入的文件名

模式

  1. 一般命令模式/默认模式:无法编写,输入命令,每一个命令对应一个字母,支持复制粘贴删除文本
  2. 编辑模式:在默认模式下按i,进入编辑模式,按esc退出
  3. 命令行模式:默认模式下按:/?三个中任意一个进入命令行模式,命令行在最下面(建议用:)。支持查找、替换、保存、退出、配置编辑器等。输入:wq,保存并退出。

操作

  1. i:进入编辑模式
  2. esc:退出编辑模式,进入一般命令模式
  3. h:光标向左移动一个字符
  4. j:光标向下移动一个字符
  5. k:光标向上移动一个字符
  6. l:光标向右移动一个字符。注:在命令模式下:vim会卡在最后一个字符前面,编辑模式会卡在最后一个字符。
  7. 光标的移动操作:
    1. n<Space>n是数字,光标会自动右移n个字符。
    2. 一般命令模式下,0/home将光标移动到本行开头,$/End将光标移动到本行结尾。
    3. G:光标移动到最后一行。
  8. 移动到具体行:
    1. n/nG:表示想去具体到哪一行(n是到某一行的下面,nG是直达)
    2. gg:到达第一行
    3. n<Enter> 向下跳n行。
  9. 查找与修改字符串:
    1. /word:在命令行模式下,光标之下寻找第一个值为word的字符串
    2. ?word:在光标之上第一个值为word的字符串
    3. n:重复前一个查找操作
    4. N:反向查找,也就是说前一个命令向前找,此命令下向后找
    5. :n1,n2s/word1/word2/g:n1,n2为数字,在第n1n2行之间找word1,并替换为word2
    6. :1,$s/word1/word2/g: 将全文的word1换成word2
    7. :1,$s/word1/word2/gc:在每一次替换的时候都会让用户进行确认
  10. :noh:关闭所查找的关键词的高亮
  11. 选中与删除:
    1. v:选中文本,按两下esc取消
    2. d:删除选中文本(其实有剪切的特性)
    3. dd:删除整行
  12. 复制与粘贴:
    1. y:复制(文本)
    2. p:在光标所处位置的下一行或下一个位置(通常当光标在两边时)粘贴
    3. yy:复制当前行
  13. 撤销:
    1. u:撤销
    2. ctrl+r:取消撤销
  14. >将选中的文本整体向右移动,<将选中的文本整体向左移动
  15. 保存与退出:
    1. :w保存
    2. :w! 强制保存
    3. 一般命令模式下:按下ESC,按q退出
    4. :q! 强制退出(不保存)
    5. :wq 保存并退出
    6. :wq! 强制保存退出
  16. 行号的显示与隐藏:
    1. :set nonu 隐藏行号
    2. :set nu 显示行号
  17. paste模式:当要粘贴过来的代码很长时,命令可能会失效,占用很大带宽,导致出现多重缩进
    1. :set paste取消代码缩进,设置成粘贴模式
    2. :set nopaste开启代码缩进
  18. gg+d+G:删除全部内容,gg=G:将全文格式化
  19. ctrl+q:当vim卡死时,可取消当前正在执行的命令
  20. 异常处理:
    1. 当前进程出现冲突时的解决方法:找到正在多个打开的文件程序,并关掉,保证同一个进程只有同一个文件能打开
    2. 当一个进程不小心被其他进程杀掉,当再打开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
2
#! /bin/bash
echo "Hello World!"

运行方式

  1. 用解释器运行
    1
    bash test.sh
  2. 作为可执行文件
    1
    2
    3
    acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 使脚本具有可执行权限
    acs@9e0ebfcd82d7:~$ ./test.sh # 当前路径下执行
    Hello World! # 脚本输出

注释

单行注释

每行中#之后的内容均是注释:

1
2
3
# 这是一行注释

echo 'Hello World' # 这也是注释

多行注释

示例:

1
2
3
4
5
:<<EOF
第一行注释
第二行注释
第三行注释
EOF

其中EOF可以换成其它任意字符串。例如:

1
2
3
4
5
:<<abc
第一行注释
第二行注释
第三行注释
abc

1
2
3
4
5
:<<!
第一行注释
第二行注释
第三行注释
!

变量

定义变量

定义变量一般定义的是字符串,但当变量需要是整数时,会自动把变量转换成整数,可以使用双引号、单引号或不加引号,且等号左右不能加空格:

1
2
3
name1="ep"
name2='ep'
name3=ep

使用变量

使用变量,需要加上 $ 符号,或者 ${} 符号。花括号是可选的,主要为了帮助解释器识别变量边界。

1
2
3
4
name=ep
echo $name # 输出ep
echo ${name} # 输出ep
echo ${name}enen # 输出epenen

只读变量

使用readonly 或者 declare -r 可以将变量变为只读。

1
2
3
name=ep
readonly ep
declare -r ep

删除变量

unset 可以删除变量

1
2
3
name=ep
unset name
echo ${name} #输出空行

变量类型

  1. 自定义变量(局部变量) 子进程不能访问的变量
  2. 环境变量(全局变量) 子进程可以访问的变量

自定义变量改成环境变量:

1
2
3
acs@9e0ebfcd82d7:~$ name=ep  # 定义变量
acs@9e0ebfcd82d7:~$ export name # 第一种方法
acs@9e0ebfcd82d7:~$ declare -x name # 第二种方法

环境变量改为自定义变量:

1
2
acs@9e0ebfcd82d7:~$ export name=name  # 定义环境变量
acs@9e0ebfcd82d7:~$ declare +x name # 改为自定义变量

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号与双引号的区别:

  1. 单引号中的内容会原样输出,不会执行、不会取变量
  2. 双引号中的内容可以执行、可以取变量
1
2
3
name=ep  # 不用引号
echo 'hello, $name \"hh\"' # 单引号字符串,输出 hello, $name \"hh\"
echo "hello, $name \"hh\"" # 双引号字符串,输出 hello, ep "hh"

获取字符串长度:

1
2
name=ep
echo ${#name}
1
2

提取子串:

1
2
name=hello, ep
echo ${name:0:5} # 提取从0开始的5个字符
1
hello

默认变量

文件参数变量

在执行 shell 脚本时,可以向脚本传递参数。

$1 是第一个参数,$2 是第二个参数,以此类推。特殊的,$0 是文件名(包含路径,其实就是我们输入的第一段,输入绝对路径就显示绝对路径,输入相对路径就显示相对路径)。例如:

1
2
3
4
5
#! /bin/bash

echo $0
echo $1
echo $2
1
2
3
./test.sh
ep
13

其他参数相关变量:

参数 说明
$(命令) 获取一个命令的标准输出,如$(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
2
3
4
array[0]=1
array[1]=abc
array[2]="def"
array[3]=ep

读取数组元素

读取特定位置:

1
${array[index]}

例如:

1
2
3
4
5
array=(1 abc "def" ep)
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}

读取整个数组:

1
2
${array[@]}  # 第一种写法
${array[*]} # 第二种写法

数组长度

类似于字符串:

1
2
${#array[@]}  # 第一种写法
${#array[*]} # 第二种写法

expr命令

expr 命令用于求表达式的值,格式为:

1
expr 表达式

expr本身也有返回值:

1
expr 3 + 4

expr可以用$()和``取返回值(stdout的结果)

1
2
str="Hello World!"
echo $(expr length "$str")

expr表达式说明

  • 用空格隔开每一项
  • 用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
  • 对包含空格和其他特殊字符的字符串要用引号括起来
  • expr会在 stdout 中输出结果。如果为逻辑关系表达式,则结果为真,stdout 为 1,否则为 0。
  • exprexit 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 的子串。 如果 POSITIONLENGTH 为负数,0 或非数值,则返回空字符串。(字符串下标从1开始,字符串变量的求子串下标从0开始)
1
2
3
4
5
str="Hello World!"

echo $(expr length "$str")
echo `expr index "$str" aWd` #因为W最先出现且位置为7所以返回7
echo `expr substr "$str" 2 3`
1
2
3
12
7
ell

整数表达式

expr 支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。

注意:所有运算符号与变量或数字之间都要用空格隔开,否则将会被识别成字符串
如:

1
2
3
4
a=2
b=3
echo $(expr $a+$b)
echo $(expr $a + $b)
1
2
2+3
5
  • +-加减运算。两端参数会转换为整数,如果转换失败则报错。
  • * / % 乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。
  • () 可以改变优先级,但需要用反斜杠转义
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a=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
    6
    7
    -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
    15
    a=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
    8
    0
    1
    0
    1
    0
    3
    5
    3

read命令

read 命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code1 ,否则为0

参数:
-p : 后面可以接提示信息
-t :后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令

1
2
3
4
5
6
7
8
acs@9e0ebfcd82d7:~$ read name
ep # 标准输入
acs@9e0ebfcd82d7:~$ echo $name
ep
acs@9e0ebfcd82d7:~$ read -p "Please input your name: " -t 30 name # 等待时间30秒
Please input your name: acwing ep
acs@9e0ebfcd82d7:~$ echo $name
ep

echo命令

echo 用于输出字符串。命令格式:

1
echo STRING

显示普通字符串

1
2
echo "Hello World"
echo Hello World # 引号可以省略

显示转义字符

1
2
echo "\"Hello World\""  # 注意只能使用双引号,如果使用单引号,则不转义
echo \"Hello World\" # 也可以省略双引号

显示变量

1
2
name=ep
echo "My name is $name"

显示换行

1
2
echo -e "Hi\n"  # -e 开启转义
echo "ep"
1
2
3
Hi

ep