Linux
终端快捷键
光标移动
快捷键 |
作用 |
crtl+a |
移动到开头 |
crtl+e |
移动到结尾 |
alt+b |
向左移动一个单词 |
alt+f |
向右移动一个单词 |
crtl+b |
向左移动一个字符 |
crtl+f |
向右移动一个字符 |
esc+b |
向左移动一个单词 |
esc+f |
向右移动一个单词 |
ctrl+XX |
在上次光标和当前光标所在字符间跳转 |
esc+t |
交换光标位置钱的两个单词 |
删除
快捷键 |
作用 |
ctrl+k |
删除光标后所有字符 |
ctrl+u |
删除光标前所有字符 |
ctrl+w |
删除光标前一个单词 |
ctrl+d |
删除光标所在字符(右侧) |
ctrl+h |
删除光标前字符(左侧) |
撤销
快捷键 |
作用 |
ctrl+_ |
撤销操作 |
ctrl+y |
粘贴ctrl+u/k剪切的内容 |
ctrl+? |
撤销前一次输入 |
alt+r |
撤销前一次动作 |
替换
快捷键 |
作用 |
ctrl+t |
将光标当前字符与前一个字符替换 |
历史命令编辑
快捷键 |
作用 |
ctrl+p |
上一条历史命令 |
ctrl+n |
下一条历史命令 |
alt+> |
上一次执行的命令的最后一个单词 |
ctrl+r |
搜索历史命令 |
控制命令
快捷键 |
作用 |
ctrl+l |
清除屏幕 |
ctrl+s |
锁住终端,阻止屏幕输出 |
ctrl+q |
解锁终端,允许屏幕输出 |
ctrl+c |
终止命令 |
ctrl+i |
补全,相当于tab |
ctrl+o |
重复执行命令 |
alt+<数字> |
操作的次数 |
ctrl+z |
挂起 |
!命令
快捷 |
作用 |
!! |
执行上条命令 |
!-n |
执行前n条命令 |
shell中的 $ 用法
特殊符号 |
含义 |
$# |
传给脚本的参数个数 |
$0 |
shell脚本文件的名字 |
$1 |
传递给该shell脚本的第一个参数 |
$2 |
传递给该shell脚本的第二个参数 |
$@ |
传给脚本的所有参数的列表 |
$* |
以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 |
$$ |
脚本运行的当前进程ID号,Shell本身的PID |
$? |
显示最后命令的退出状态,0表示没有错误,其他表示有错误 |
$! |
Shell最后运行的后台Process的PID |
$- |
使用Set命令设定的Flag一览 |
$() |
相当于``,括号中放的是命令 |
${} |
括号中放的是变量。例如echo P A T H 取 P A T H 变 量 的 值 并 打 印 , 也 可 以 不 加 括 号 比 如 {PATH}取PATH变 量的值并打印,也可以不加括号比如PATH取PATH变量的值并打印,也可以不加括号比如PATH。 |
$1~n |
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 |
${}的特殊用法
1 2 3 4 5 6 7 8 9 10 11 12
| # sh, dash 都不能使用该语法 # 基础语法:${parameter,,pattern} / ${parameter^^pattern} # 另外这个语法不会改变原变量 var="Hello,World" # 第一个字符变为大写 echo ${var^} # 所有字符变为大写 echo ${var^^} # 第一个字符变为小写 echo ${var,} # 所有字符变为小写 echo ${var,,}
|
判断/比较
语法(用例)
1 2 3 4 5 6 7 8 9
| if [ $SYSTEM = "Linux" ] ; then # 如果是linux话输出linux字符串 echo "Linux" elif [ $SYSTEM = "FreeBSD" ] ; then echo "FreeBSD" elif [ $SYSTEM = "Solaris" ] ; then echo "Solaris" else echo "What?" fi # 判断结束,以fi结尾
|
字符串判断
语法 |
含义 |
str1 = str2 |
当两个串有相同内容、长度时为真 |
str1 != str2 |
当串str1和str2不等时为真 |
-n str1 |
当串的长度大于0时为真(串非空) |
-z str1 |
当串的长度为0时为真(空串) |
str1 |
当串str1为非空时为真 |
数字的判断
语法 |
含义 |
int1 -eq int2 |
两数相等为真 |
int1 -ne int2 |
两数不等为真 |
int1 -gt int2 |
int1大于int2为真 |
int1 -ge int2 |
int1大于等于int2为真 |
int1 -lt int2 |
int1小于int2为真 |
int1 -le int2 |
int1小于等于int2为真 |
文件相关的if判断条件语句
语法 |
含义 |
-r file |
用户可读为真 |
-w file |
用户可写为真 |
-x file |
用户可执行为真 |
-f file |
文件为正规文件为真 |
-d file |
文件为目录为真 |
-c file |
文件为字符特殊文件为真 |
-b file |
文件为块特殊文件为真 |
-s file |
文件大小非0时为真 |
-t file |
当文件描述符(默认为1)指定的设备为终端时为真 |
复杂逻辑判断
[] 和 [[]] 的区别
if [[]] 要求括号里的表达式前后必须有一个空格,格式如 if [[ xxx ]]。
当 if [[]] 用于字符串常量或变量比较时,表达式本身的运算符,如 <、>、==、!= ,其前后可以不加空格;
但当 if [[]] 用于数值比较时,表达式本身的运算符前后必须加空格,否则会得到相反的结果。
如:
1 2 3 4 5 6 7
| if [[ $1 != "start" && $1 != "stop" ]]
在if之后要用空格,[[ 之后要有一个空格,]]之前要有空格,不然会出错.
elif [[ $1 == "stop" ]]
双等号两边要有空格不然后会出错.
|
在shell中查看每条指令实际执行的结果
set +x
表示开始记录,set -x
表示停止记录。
例子:
1 2 3 4
| set +x name="test" echo $name set -x
|
实用小技巧
查找包含某个字符串的所有文件,可以用于后续的自动处理:
1 2 3 4 5 6 7
| # 指令 grep -r "desktop\." | awk '{print $1}' | sed 's/://g' | uniq # 用途 for script_name in `grep -r "desktop\." | awk '{print $1}' | sed 's/://g' | uniq` do echo y | edopkg pull $script_name done
|
日志管理
dmesg
命令可以查看系统的整个启动日志
GIT
批量删除已合并分支
1 2 3 4 5 6 7 8 9 10
| # 获取已合并分支 git branch --merged # 筛选去除指定字符串(正则方式) grep -i -v -E "master|dev" # 以字符串结尾的 grep -i -v -E "x-master$|x-develop$|x-release$" # 批量执行(要用管道) xargs git branch -d # 合起来 git branch --merged | grep -i -v -E "x-master$|x-develop$|x-release$" | xargs git branch -d
|
删除远程跟踪分支
git remote prune origin
修改当前commit
git add . && git commit --amend --no-edit
该操作会修改当前最新commit并添加当前目录下所有修改了但未提交的文件。
如果最新commit已经push到远端,则需要再次强制推送到远端。
查找某个commit被哪个branch和tag包含
查找被包含的branch:git branch --contains commit_id --all
查找被包含的tag:git tag --contains tag_name
设置命令别名
1 2 3
| git config --global alias.a add git config --global alias.c commit git config --global alias.o checkout
|
也可以在config文件进行修改和查看,
在~/.gitconfig
或项目的.git/config
文件中,有以下信息,可以进行修改:
[alias]
a = add
c = commit
o = checkout
# ...
还可以直接用别人写好的:
项目地址
使用方法:
- 首先将该开源项目中的
gitalias.txt
文件下载下来
- 然后在
.gitconfig
文件里面加入:1 2
| [include] path = gitalias.txt
|
获取两个commit之间更改的文件
可以方便在shell或者bash中执行自动化操作
以最新的更新为例:git diff --name-only HEAD HEAD^
执行自动化操作:for fp in `git diff --name-only HEAD HEAD^`; do echo $fp; done
Docker
删除虚悬镜像:docker images --filter dangling=true
删除所有虚悬镜像:
1 2 3 4 5
| docker rmi $(docker images --filter dangling=true -q) # 或 docker image prune # 删除24小时前的虚悬镜像,-a 标签还支持删除所有未使用的镜像 docker image prune -f --filter until=24h
|
列出latest镜像之前的所有镜像:docker images aka-gm --filter before=aka-gm:latest
从以上输出中取出镜像的REPOSITORY与TAG:docker images aka-gm --filter before=aka-gm:latest --format "{{.Repository}}:{{.Tag}}"
排除TAG为的镜像并删除:docker images aka-gm -f before=aka-gm:latest | grep aka-gm | grep -v "<none>" | awk '{printf "%s:%s\n",$1,$2}' | xargs -r docker rmi
删除TAG为的镜像:docker images aka-gm -f before=aka-gm:latest | grep "<none>" | awk '{printf "%s:%s\n",$1,$2}' | xargs -r docker rmi
找出容器对应的日志滤镜:docker inspect --format='{{.LogPath}}' containername