• 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参数…。 |

    ${}的特殊用法

    # sh, dash 都不能使用该语法
    # 基础语法:${parameter,,pattern} / ${parameter^^pattern}
    # 另外这个语法不会改变原变量
    var="Hello,World"
    # 第一个字符变为大写
    echo ${var^}
    # 所有字符变为大写
    echo ${var^^}
    # 第一个字符变为小写
    echo ${var,}
    # 所有字符变为小写
    echo ${var,,}

    判断/比较

    语法(用例)

    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 [[]] 用于数值比较时,表达式本身的运算符前后必须加空格,否则会得到相反的结果。

    如:

    if [[ $1 != "start"  &&  $1 != "stop" ]]

    在if之后要用空格,[[ 之后要有一个空格,]]之前要有空格,不然会出错.

    elif [[ $1 == "stop" ]]

    双等号两边要有空格不然后会出错.

    在shell中查看每条指令实际执行的结果

    set +x表示开始记录,set -x表示停止记录。

    例子:

    set +x
    name="test"
    echo $name
    set -x

    实用小技巧

    查找包含某个字符串的所有文件,可以用于后续的自动处理:

    # 指令
    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

    批量删除已合并分支

    # 获取已合并分支
    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

    设置命令别名

    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文件里面加入:
    [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
    删除所有虚悬镜像:

    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