本人学习linux系统采用Ubuntu服务器20.04,从零基础开始学习,记录学习的过程。
一、linux常用管理命令
常用命令
ctrl + c : 终止执行当前命令(换行)(避免死循环)
ctrl + u : 删除当前行命令(写错了不用一个一个删,便捷)
ls : 列出当前目录下所有文件
tab : 可以补全命令和文件名(补全不了可以按两下,显示备选文件)、
ls -l : 表示出文件的详细信息
ls -l(h) :命令的简化
ls -a :显示所有文件(包括隐藏文件)
pwd : 显示当前目录
cd :进入xxx目录下
cd ·· :返回上一层目录
cd -: 返回上一个demo的目录 (一直操作就来回循环)
cp : 复制 + 粘贴 + 重命名 (cp a/tmp.txt b)
cp -r :复制整个文件夹,包括文件 (cp a b -r)
mkdir : 创建文件夹 (mkdir a)
mkdir - p : 连续创建文件夹 (mkdir a/b/c -p)
rm : 删除文件
rm - r :删除文件夹
touch :创建文件
rm * : 正则表达式(rm *.txt 删除所有同名文件)
mv : 剪切 + 粘贴 + 重命名
ctrl + insert : 复制文本
shift + insert :粘贴文本
二、 tmux和vim
tmux
每执行一次tmux,就是建立一个session,其中包含一个window ,window下包含一个pane,pane里打开了一个shell对话框。
常用操作
部分仅支持Ac teminal
ctrl + a 松开 + % :将pane左右半分
ctrl + a 松开 + “ : 将pane上下半分
ctrl + d :关闭一个pane
ctrl + a 松开 + z :将pane全屏 / 退出全屏
ctrl + a 松开 + d :挂起当前session
tmux a :打开之前挂起的session
ctrl + a + s : 选择session
shift :选择文本
ctrl + a + c :在session 中创建一个新的window
vim
功能
命令行下的文本编辑器,根据文件名判断编程语言,支持代码缩进,代码高亮等功能。
使用方式
vim + filename,如果存在该文件,则将它打开,如果不存在, 则打开一个文件,并命名为filename。
模式
1.一般命令模式:默认模式。类似游戏里的召唤师技能,支持复制粘贴等快捷操作。
2.编辑模式:在一般命令模式下按i,按Esc退出编辑模式。
3.命令行模式:在一般命令模式下,按:/ ? 任意一个,会进入命令模式。命令模式下可以查找、替换、保存等功能。
(1) i:进入编辑模式
(2) ESC:进入一般命令模式
(3) h 或 左箭头键:光标向左移动一个字符
(4) j 或 向下箭头:光标向下移动一个字符
(5) k 或 向上箭头:光标向上移动一个字符
(6) l 或 向右箭头:光标向右移动一个字符
(7) n<Space>:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符
(8) 0 或 功能键[Home]:光标移动到本行开头
(9) $ 或 功能键[End]:光标移动到本行末尾
(10) G:光标移动到最后一行
(11) :n 或 nG:n为数字,光标移动到第n行
(12) gg:光标移动到第一行,相当于1G
(13) n<Enter>:n为数字,光标向下移动n行
(14) /word:向光标之下寻找第一个值为word的字符串。
(15) ?word:向光标之上寻找第一个值为word的字符串。
(16) n:重复前一个查找操作
(17) N:反向重复前一个查找操作
(18) :n1,n2s/word1/word2/g:n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为word2
(19) :1,$s/word1/word2/g:将全文的word1替换为word2
(20) :1,$s/word1/word2/gc:将全文的word1替换为word2,且在替换前要求用户确认。
(21) v:选中文本
(22) d:删除选中的文本
(23) dd: 删除当前行
(24) y:复制选中的文本
(25) yy: 复制当前行
(26) p: 将复制的数据在光标的下一行/下一个位置粘贴
(27) u:撤销
(28) Ctrl + r:取消撤销
(29) 大于号 >:将选中的文本整体向右缩进一次
(30) 小于号 <:将选中的文本整体向左缩进一次
(31) :w 保存
(32) :w! 强制保存
(33) :q 退出
(34) :q! 强制退出
(35) :wq 保存并退出
(36) :set paste 设置成粘贴模式,取消代码自动缩进
(37) :set nopaste 取消粘贴模式,开启代码自动缩进
(38) :set nu 显示行号
(39) :set nonu 隐藏行号
(40) gg=G:将全文代码格式化
(41) :noh 关闭查找关键词高亮
(42) Ctrl + q:当vim卡死时,可以取消当前正在执行的命令
异常处理:
每次用vim编辑文件时,会自动创建一个.filename.swp的临时文件。
如果打开某个文件时,该文件的swp文件已存在,则会报错。此时解决办法有两种:
(1) 找到正在打开该文件的程序,并退出
(2) 直接删掉该swp文件即可
三、shell语法
概论
shell是我们通过命令行和操作系统沟通的语言。
Ac terminal中的命令行可以看作一个“shell脚本在逐行执行”。
学习技巧:不要死记硬背,遇到含糊不清的问题,在Ac terminal里面执行一下。
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,所以接下来重点学习bash语法。
文件开头需要加#! /bin/bash ,这个指令是文件解释器,类似c++中的头文件。
脚本示例(Hello world)
新建一个test.sh文件。
#! /bin/bash
echo "Hello world!"
运行方式
用可执行文件执行
chmod +x test.sh #作为可执行文件
./ test.sh #当前路径下运行
/home/acs/test.sh #在绝对路径下运行
~/test.sh #在家目录下运行
用解释器执行
bash test.sh
单行注释 注释
# 这是一行注释
echo 'Hello World' # 这也是注释
多行注释
格式:
:<<EOF
第一行注释
第二行注释
第三行注释
EOF
其中EOF可以换成其它任意字符串。
:<<abc
第一行注释
第二行注释
第三行注释
abc
:<<!
第一行注释
第二行注释
第三行注释
!
变量
定义变量
name=yxc
name='yxc'
name="yxc"
使用变量
加上$符号,或者${}符号。{}是可选的,主要是为了给解释器一个识别的边界。
name=yxc
echo $name
echo ${name}
echo ${name}acwing
只读变量
使用readonly或者declare可以将变量变为只读
name=yxc
readonly name
declare -r name
name=abc #会报错,因为那么为只读
删除变量
使用unset可以删除变量
name=yxc
unset name
echo $name #输出空行
变量类型
自定义变量:
子进程不能访问的变量
环境变量:
子进程可以访问的变量
自定义变量变为环境变量:
name=yxc
export name #第一种写法
declare -x #第二种写法
环境变量变为自定义变量
name=yxc
export name=yxc #第一种写法
declare +x #第二种写法
字符串
字符串可以用双引号,单引号,也可以不用引号。
单引号和双引号的区别
单引号中的内容会原样输出,不会执行,不会取变量
双引号中的内容可以执行,可以取变量
name=yxc # 不用引号
echo 'hello, $name \"hh\"' # 单引号字符串,输出 hello, $name \"hh\"
echo "hello, $name \"hh\"" # 双引号字符串,输出 hello, yxc "hh"
获取字符串长度
name=yxc
echo ${#name} #输出3
提取字串
name=yxc
echo ${name:0:3} #从0开始的三个字符
默认变量
在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数...以此类推。特殊的$0是文件名(绝对路径)
#! /bin/bash
echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4
acs@9e0ebfcd82d7:~$ chmod +x test.sh
acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4
文件名:./test.sh
第一个参数:1
第二个参数:2
第三个参数:3
第四个参数:4
其它参数相关变量
$# :代表文件中传入参数的个数,上例为4
$@:由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"
$* : 每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4"
$? : 上一条命令的退出状态(exit code)。0表示正常推出,其它值表示错误
$(): 返回命令的stdout(可嵌套)
``: 返回命令的stdout(不可嵌套)
数组
数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
数组下标从0开始。
定义
数组用小括号表示,元素之间用空格隔开。例如:
array=(1 2 3 4)
也可以直接定义数组中某个元素的值
array[0]=1
array[1]=2
array[1000]=3
读取某个元素的值
格式:
${array[index]} # ${array[1]}
读取整个数组的值
${array[@]}
${array[*]}
数组长度
${#array[@]}
${#array[*]}
expr命令
expr用来求表达式的值
格式为:expr 表达式
表达式说明
用空格隔开每一项
用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
expr会在stdout中输出结果。如果为逻辑关系表达式,则1为真,0为假
expr会在exit code中输出结果。如果为逻辑关系表达式,则0为真,其它值为假
字符串表达式
length string :求字符串的长度
index string charset :CHARSET中任意单个字符在STRING中最前面的字符位置,下标从1开始。如果在STRING中完全不存在CHARSET中的字符,则返回0。
substr string possition length :返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITION或LENGTH为负数,0或非数值,则返回空字符串。
例
str="Hello World"
echo `expr length"$str"` #输出11
echo `expr charset "$str" aWd` #下标从1开始,输出7
echo `expr substr "$str" 2 3` #下标从1开始,从2开始输出3个字符,ell
整数表达式
注意:* ( ) 三个运算符需要转义符号
示例:
a=3
b=4echo `expr $a + $b` # 输出7
echo `expr $a - $b` # 输出-1
echo `expr $a \* $b` # 输出12,*需要转义
echo `expr $a / $b` # 输出0,整除
echo `expr $a % $b` # 输出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)` # 输出20,值为(a + 1) * (b + 1)
逻辑关系表达式
|
第一个参数为非空且非0 ,返回第一个参数的值,不会计算第二个参数的值
否则,如果第二个参数为非空且非0,返回第二个参数
第二个参数为空或者0,则返回0
&
如果两个参数都为非空且非0,则返回第一个参数,否则返回0。
如果第一个参数为空或者0,则不会计算第二个参数的值
< <= = == != >= >
比较两端的参数,如果为true,则返回1,否则返回0。”==”是”=”的同义词。”expr”首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。()可以改变优先级,但需要用反斜杆转义
a=3
b=4echo `expr $a \> $b` # 输出0,>需要转义
echo `expr $a '<' $b` # 输出1,也可以将特殊字符用引号引起来
echo `expr $a '>=' $b` # 输出0
echo `expr $a \<\= $b` # 输出1c=0
d=5echo `expr $c \& $d` # 输出0
echo `expr $a \& $b` # 输出3
echo `expr $c \| $d` # 输出5
echo `expr $a \| $b` # 输出3
read命令
read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0。
参数说明
-p: 后面可以接提示信息
-t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令
实例:read name
acwing yxc
echo $name #输出acwing yxc
交互效果:
read -p "Please input your name: " -t 30 name # 读入name的值,等待时间30秒
acwing yxc
echo $name #输出acwing yxc
echo命令
echo用于输出字符串。
格式:echo string
显示普通字符串
echo "Hello world"
echo Hello world #引号可以省略
显示转义字符
echo "\"Hello AC Terminal\"" # 注意只能使用双引号,如果使用单引号,则不转义
echo \"Hello AC Terminal\" # 也可以省略双引号
显示变量
name=yxc
echo "My name is $name"
显示换行
echo -e "Hi\nyxc" #-e开启转义 \n 换行
#输出:Hi
yxc
显示不换行
echo -e "Hi \c" # -e 开启转义 \c 不换行
echo "acwing"
输出结果:Hi acwing
显示结果定向至文件
echo "Hello World" > output.txt # 将内容以覆盖的方式输出到output.txt中
原样输出字符串,不进行转义或取变量
name=yxc
echo '$name\"'
输出:$name\"
显示命令的执行结果
echo `date` #显示当时的时间
printf命令
printf命令用于格式化输出,类似于C/C++中的printf函数。
将,替换成【space】键
例如:
printf "%10d\n" 123
test命令与判断符号[]
逻辑运算符&&和||
&&
expr1 && expr2 #如果expr1为假时,则直接忽略expr2
expr1 || expr2 #如果expr1为真时,则直接忽略expr2
表达式的exit code 为0(正常退出),表示真,非0为假 (与c ++ 不同)
经常用来作if判断
test命令
在命令行中输入man test,可查看test命令的用法
test命令常用来判断文件类型,以及对变量作比较
test命令用exit code作为结果,而不是stdout。0为真,非0为假
例如
test 2 -lt 3 # 结果为真 , 返回0
echo $? #输出上一个命令的返回值,为0
文件类型判断
test -e :判断文件是否存在
test -f :判断是否为文件
test -d :判断是否为文件夹
例:
test -e -filename
文件权限判断
test -r :判断文件是否可读
test -w :判断文件是否可写
test -x : 判断文件是否可以执行
test -s :判断文件是否为空位件
例:
test -r -filename
整数间的比较
test $a -eq $b #a是否等于b
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
字符串的比较
test -z string : 判断是否为空
test -n string :判断是否非空(-n可以省略)
test str1 == str2 :判断字符串是否相等
test str1 != str2 :判断字符串是否不相等
多重条件判定
test -r filename -a -x filename
-a 两条件是否同时成立
-o 两条件是否至少一个成立
! 取反。如 test ! -x file,当file不可执行时,返回true
判断符号[]
[ 2 -lt 3 ] # 结果为真 ,返回0
echo $? #输出0
ls # 列出当前目录下的所有文件
homework output.txt test.sh tmp[ -e test.sh ] && echo "exist " || echo "Not exist" #test.sh文件存在
[ -e test2.sh] && echo "exist" || echo "Not exist" #test2.sh文件不存在
注意:
[]中的每一项都要用空格隔开
中的变量最好用双引号括起来
中的常量最好用单或双引号括起来
例如
name=acwing yxc
[ $name == "acwing yxc" ] # 错误 等价于 [ acwing yxc == "acwing yxc" ],参数太多
[ "$name" == "acwing yxc" ] #正确
判断语句
if...then格式
a=3
b=4
if [ $a -gt $b ]
then
echo "3 < 4"
fi
单个if ...else格式
a=3
b=4
if [ $a -gt $b ]
then
echo "3 > 4"
else
echo "3 < 4"
fi多层if..elif...elif...else
a=4
if [ $a -eq 1 ]
then
echo ${a}等于1
elif [ $a -eq 2 ]
then
echo ${a}等于2
elif [ $a -eq 3 ]
then
echo ${a}等于3
else
echo 其他
fi
case...esac形式
类似c/c++ 中的switch语句
a=4
case $a in
1)
echo ${a}等于1
;;
2)
echo ${a}等于2
;;
3)
echo ${a}等于3
;;
*)
echo 其他
;;
esac
循环语句
for...in...do...done
命令格式:
for var in val1 val2 val3
do
语句1
语句2
done
示例 :
for i in a 2 cc
do
echo $i
done
输出:a
2
cc
for file in `ls`
do
echo $file
done
输出路径下所有文件名
for i in `seq 1 10`
do
echo $i
done
输出1~10
for i in {1..19}
do
echo $i
done
输出1~19
for ((...;...;...)) do...done(类似c++)
for (( i = 1 ; i <= 10 ; i ++ ))
do
echo $i
done
输出1~10
五、git
git的基本概念
工作区:仓库的目录。工作区是独立于各个分支的。
暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
版本库:存放所有已经提交到本地仓库的代码版本
版本结构:树结构,树中每个节点代表一个代码版本。
git的常用命令
全局设置:
git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中常用命令:
git add XX:将XX文件添加到暂存区
git add .:将所有待加入暂存区的文件加入暂存区
git commit -m "给自己看的备注信息":将暂存区的内容提交到当前分支
git status:查看仓库状态查看命令:
git diff XX:查看XX文件相对于暂存区修改了哪些内容
git log:查看当前分支的所有版本
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)git branch:查看所有分支和当前所处分支
代码回滚:git reset --hard HEAD^ 或 git reset --hard HEAD~:将代码库回滚到上一个版本
git reset --hard HEAD^^:往上回滚两次,以此类推
git reset --hard HEAD~100:往上回滚100个版本
git reset --hard 版本号:回滚到某一特定版本
远程仓库:git remote add origin git@git.acwing.com:xxx/XXX.git:将本地仓库关联到远程仓库
git push -u (第一次需要-u以后不需要):将当前分支推送到远程仓库
git push origin branch_name:将本地的某个分支推送到远程仓库
git clone git@git.acwing.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
git checkout -b branch_name:创建并切换到branch_name这个分支
git checkout branch_name:切换到branch_name这个分支
git merge branch_name:将分支branch_name合并到当前分支上
git branch branch_name:创建新分支
git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
git pull:将远程仓库的当前分支与本地仓库的当前分支合并
git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应
git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地删除命令:
git rm --cached XX:将文件从仓库索引目录中删掉
git checkout — XX或git restore XX:将XX文件尚未加入暂存区的修改全部撤销
git branch -d branch_name:删除本地仓库的branch_name分支
git push -d origin branch_name:删除远程仓库的branch_name分支
stash暂存:
git stash:将工作区和暂存区中尚未提交的修改存入栈中
git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop:删除栈顶存储的修改
git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
git stash list:查看栈中所有元素
七、管道,环境变量与常用命令
管道
概念:
类似与文件的重定向,接收前一个命令的stdout重定向到下一个命令的stdin
要点:
1、管道命令仅处理stdout,忽略stderr
2、管道右边的命令必须能够接收stdin
3、多个管道命令可以串联
举例:
find . -name '*.py' | xargs cat | wc -l
环境变量
查看:
env # 显示当前用户的变量
set # 显示当前shell的变量,包括当前用户的变量;
export # 显示当前导出成用户变量的shell变量echo $path #输出某个环境变量的值
修改:
环境变量的定义、修改、删除操作可以参考3. shell语法——变量这一节的内容。
为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到~/.bashrc文件中。
修改完~/.bashrc文件后,记得执行source ~/.bashrc,来将修改应用到当前的bash环境下。为何将修改命令放到~/.bashrc,就可以确保修改会影响未来所有的环境呢?
每次启动bash,都会先执行~/.bashrc。
每次ssh登陆远程服务器,都会启动一个bash命令行给我们。
每次tmux新开一个pane,都会启动一个bash命令行给我们。
所以未来所有新开的环境都会加载我们修改的内容
常见环境变量
HOME:用户的家目录。
PATH:可执行文件(命令)的存储路径。路径与路径之间用:分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。
LD_LIBRARY_PATH:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表。
C_INCLUDE_PATH:C语言的头文件路径,内容是以冒号分隔的路径列表。
CPLUS_INCLUDE_PATH:CPP的头文件路径,内容是以冒号分隔的路径列表。
PYTHONPATH:Python导入包的路径,内容是以冒号分隔的路径列表。
JAVA_HOME:jdk的安装目录。
CLASSPATH:存放Java导入类的路径,内容是以冒号分隔的路径列表。
常用命令
系统状况
top(linux的任务管理器):
打开top后按M:按内存排序
打开top后按P:按cpu排序
打开top后按q:退出任务管理器
df -h :查看硬盘使用情况
free -h :查看内存使用情况
du -sh :查看当前目录占用内存的情况
ps aux :查看所用进程,精确找到进程(通常使用管道)
kill -9 pid :杀死一个进程
netstat -nt :查看网络连接
w :列出当前登录的用户
ping www.baidu.com : 查看网址是否联网
文件检索:
find /path/to/directory/ -name '*.py':搜索某个文件路径下的所有*.py文件
grep xxx:从stdin中读入若干行数据,如果某行中包含xxx,则输出该行;否则忽略该行。
wc:统计行数、单词数、字节数
既可以从stdin中直接读入内容;也可以在命令行参数中传入文件名列表;
wc -l:统计行数
wc -w:统计单词数
wc -c:统计字节数
tree:展示当前目录的文件结构
tree /path/to/directory/:展示某个目录的文件结构
tree -a:展示隐藏文件
ag xxx:搜索当前目录下 的所有文件,检索xxx字符串
cut:分割一行内容
从stdin中读入多行数据
echo $PATH | cut -d ':' -f 3,5:输出PATH用:分割后第3、5列数据
echo $PATH | cut -d ':' -f 3-5:输出PATH用:分割后第3-5列数据
echo $PATH | cut -c 3,5:输出PATH的第3、5个字符
echo $PATH | cut -c 3-5:输出PATH的第3-5个字符
sort:将每行内容按字典序排序
可以从stdin中读取多行数据
可以从命令行参数中读取文件名列表
xargs:将stdin中的数据用空格或回车分割成命令行参数
find . -name '*.py' | xargs cat | wc -l:统计当前目录下所有python文件的总行数
查看文件内容
more:浏览文件内容
回车:下一行
空格:下一页
b:上一页
q:退出
less:与more类似,功能更全
回车:下一行
y:上一行
Page Down:下一页
Page Up:上一页
q:退出
head -3 xxx:展示xxx的前3行内容
同时支持从stdin读入内容
tail -3 xxx:展示xxx末尾3行内容
同时支持从stdin读入内容
工具
md5sum:计算md5哈希值
可以从stdin读入内容
也可以在命令行参数中传入文件名列表;
time command:统计command命令的执行时间
ipython3:交互式python3环境。可以当做计算器,或者批量管理文件。
! echo "Hello World":!表示执行shell脚本
watch -n 0.1 command:每0.1秒执行一次command命令
tar:压缩文件
tar -zcvf xxx.tar.gz /path/to/file/*:压缩
tar -zxvf xxx.tar.gz:解压缩
diff xxx yyy:查找文件xxx与yyy的不同点
安装软件
sudo command:以root身份执行command命令
apt-get install xxx:安装软件
pip install xxx --user --upgrade:安装python包