程序员手记

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)指定的设备为终端时为真

复杂逻辑判断

语法 含义
-a
-o
!

[] 和 [[]] 的区别

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
# ...

还可以直接用别人写好的:
项目地址
使用方法:

  1. 首先将该开源项目中的gitalias.txt文件下载下来
  2. 然后在.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