Windows10 + WSL(Ubuntu 20.04LTS) 用的越来越多,就想系统的入门一下: vim 和 Linux Shell

Vi(m) 入门

所有类 Unix 系统都自带 vi,所以学习 vi 收益满满!

参考:如何高效使用VimLinux vi/vim | 菜鸟教程

vi(m) 工作模式图解

vimWorkMod

常见命令(区分大小写) 含义
gg 移动到当前文件的第一行
G 移动到当前文件的最后一行
M 移动到当前文件的中间一行
Ctrl + o 移动到上一次编辑的地方
:n , 其中 n 为数字 输入一个 :,再输入一个 数字,按回车,快速跳到某一行
ndd,其中 n 为数字(不写默认为 1) 删除光标所在的行,并且内容在剪切板
nyy,其中 n 为数字(不写默认为 1) 复制光标所在的行,并且内容在剪切板
D 删除 光标 到行 末尾 所有的内容,并且内容在剪切板
p 粘贴剪切板的内容到光标处
/word 向光标之下寻找一个名称为 word 的字符串
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。继续搜索下一个目标
N 这个 N 是英文按键。与 n 刚好相反
Ctrl + v 进入列选择模式
Shift + v 进入行选择模式
u 复原前一个动作
Ctrl+r 重做上一个动作
Ctrl+n 常规(Normal)补全
Ctrl+o 全能(Omni)补全

.vimrc 超简洁设置:

1
2
3
4
5
6
syntax on    " 语法高亮
set nu " 行数显示
set ts=4 " tab 宽度
set spell " 语法拼写检测
set noexpandtab " 不将 tab 转换成空格
colorscheme darkblue " 颜色主题: /usr/share/vim/vimxx/colors (xx: 版本号)

vi(m)键盘图

vim-vim

vi(m) 命令思维导图

vim

Linux Shell 入门

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

参考:Shell 教程 | 菜鸟教程这些Shell编程必备知识你都掌握了吗?

Hello Shell

vim test.sh 编辑下面内容

1
2
#!/bin/bash
echo "Hello Shell "

esc + :wq 保存,执行下面命令

1
2
3
4
5
6
#使脚本具有执行权限
$ chmod +x test.sh
#执行脚本,若报错则输入 chmod u+x test.sh
$ ./test.sh
#无执行权限时
$ sh ./test.sh

Shell 变量

1
2
3
4
5
6
7
8
hello=123 # 变量定义
readonly my_blog="dna049.com" #只读变量(常量)定义
echo $my_blog #变量引用方式一,不推荐
echo ${my_blog} #变量引用方式二,推荐
for skill in C++ Python SageMath; do
echo "I am good at ${skill}Script"
done
unset my_blog #删除变量

变量定义 = 两边不能有空格!

Shell 字符串

1
2
3
4
5
6
myBlog='dna049.com' #单引号里的任何字符都会原样输出, 不支持转义
str="My Blog is \"$myBlog\"! \n"
echo -e $str # -e 开启转义
echo 'hello, ' ${myBlog} " Welcome!" #单引号双引号都可以做字符拼接
echo ${#myBlog} #获取字符串长度
echo ${myBlog:0:6} # 输出dna049

Shell 传递参数

  • $n:传入参数,例如:$0 $1 $2 分别表示,脚本名,第一个参数,第二个参数
  • $#:脚本后面跟的参数个数(不包含脚本名)
  • $@:所有参数,并且可以被遍历
  • $*:所有参数
  • \$$:当前脚本的进程 ID (没有 \)
  • $?:上一条命令的退出状态

Shell 数组

1
2
3
4
5
6
array=(A B "cpp" D)
echo ${array[2]}
echo "数组元素个数为: ${#array[*]}" # @* 都对应着全部内容
echo "数组元素为: ${array[@]}"
echo ${array[@]:1:4}
echo ${array[@]::3}

Shell 运算符

  • 算数运算符: + - * / % = == !=
  • 关系运算符:-eq -ne -ge -lt -gt -le
  • 布尔运算符:! -o -a (取否,or,and)
  • 逻辑运算符:&& || ,需要: [[ expr ]]
  • 字符串运算符:= != -z -n $
  • 文件测试运算符:-b -c -d -f -g -k -p -u -r -w -x -s -e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
a=11;b=22
val=`expr $a + $b`
echo "a + b : $val"

if [ $a == $b ];then
echo "a 等于 b"
elif [ $a -gt $b ];then
echo "a 大于 b"
elif [ $a -lt $b ];then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

if [[ $a -lt 100 && $b -gt 100 ]];then
echo "返回 true"
else
echo "返回 false"
fi

a="abc"
if [ -n $a ];then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi

expr 是一款表达式计算工具,使用它能完成表达式的求值操作

条件表达式要放在方括号之间,并且要有空格,例如L:[$a==$b] 是错误的,必须写成 [ $a == $b ]

Shell printf 命令

printf format-string [arguments...]

例如: printf "%-8s = %10.4f\n" pi 3.141592653

%s %c %d %f 都是格式替代符

%-8s 指一个宽度为 8 个字符(- 表示左对齐,没有则表示右对齐),如果不足则自动以空格填充,超过也会将内容全部显示出来。

Shell 流程控制

条件控制

  • if else-if else 已经在上面例子中提过了。

  • case esac 的奇葩写法,吐了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
    1) echo '你选择了 1'
    ;;
    2) echo '你选择了 2'
    ;;
    3) echo '你选择了 3'
    ;;
    4) echo '你选择了 4'
    ;;
    *) echo '你没有输入 1 到 4 之间的数字'
    ;;
    esac

    read 输入快乐啊!

循环控制:for while until break continue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 例子来自 https://www.runoob.com/linux/linux-shell-process-control.html
for str in 'This is a string'
do
echo $str
done
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done

a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done

Shell 函数

1
2
3
4
5
6
7
8
9
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
echo "-----函数开始执行-----"
funWithParam 3 . 1 4 1 5 9 2
echo "-----函数执行完毕-----"

Shell 输入/输出重定向和文件包含(特别好用!)

1
2
3
4
$ echo "菜鸟教程:www.runoob.com" > users
$ cat users
$ echo "菜鸟教程:www.runoob.com" >> users
$ cat users
  • test2.sh 中调用 test.sh:source ./test.sh

  • 管道运算符 |,是 unix 一个很强大的功能。

    command 1 | command 2

    把第一个命令 command 1 执行的结果作为 command 2 的输入,例如:

    $ ls -s|sort -nr

Linux 工具: