Linux学习之旅6——Vim编辑器与Shell脚本编程基础
一.Vim编辑器
安装
1
sudo apt install vim
Vim的教程文档
1
vimtutor
三种模式
交互模式(Interactive Mode):打开vim默认的模式,不能直接输入文本,但它可以让我们在文本间移动,删除文本,复制粘贴文本,跳转到指定行,撤销操作等。
第一部分命令(复制、粘贴、删除、撤销等)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24该模式下第一部分命令:
kjhl分别代表上下左右移动光标
0 / $代表移动到行首/末尾
w:移动到下一个单词
x:删除一个字符(若要删除光标后几个字符,先输入个数,再按x即可)
d:删除单词、行
dd:删除行(先输入数字,再按下dd会删除光标所在行开始的n行)
dw:删除单词
d0:删除行首
d$:删除行末
yy:复制行到内存中
yw:复制一个单词
y$:复制光标到行末所有字符
y0:复制光标到行首所有字符
p:粘贴(在前面加上数字n,代表粘贴n次)
r:替换一个字符(rs代表将当前光标所在字符换成s)
R:替换模式,可以替换多个字符
u:撤销操作
Ctrl+R:取消撤销第二部分命令
1
2
3
4
5
6
7
8
9
10Shift+g(G):跳转到文档最后一行
gg:跳转到第一行
行号+gg:跳转到指定行
/:查找模式(用?代替表示从光标处向文件头搜索)
:s 命令:查找并替换(-s/旧字符串/新字符串:替换光标所在行第一个旧字符串)
:3,6 s/old/new/g (将3到6行匹配"old"的字符串替换为"new",注意后面g参数)
:%s/旧字符串/新字符串/g:替换文件中所有匹配的字符串
:r 命令:合并文件(:r file.txt 代表在光标处插入该文件内容)第三部分命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15:sp 命令:横向分屏 (sp: 另一个文件)
:vsp 命令:垂直分屏
Ctrl+W两次:从一个viewport移动到另一个viewport
Ctrl+W+(k/j/h/l):移动光标到上/下/左/右方的viewport
Ctrl+W 接以下命令
+:扩大当前viewport
-:缩小当前viewport
=:重新分配各个viewport占比
r:调换各个viewport位置
q/c:关闭当前viewport
o:只保留当前viewport
:! 命令:运行外部命令(例如:!ls)
插入模式(Insert Mode):按字母键 i 开启,这是我们熟悉的类似windows下记事本的模式,按ESC退出该模式
命令模式(Command Mode):按 冒号键 开启用该模式激活一些vim配置,还可以发送一些命令给终端
1
2
3
4
5
6
7
8#该模式下:
#w 命令:保存文件(write),例如:
w file.txt
#q 命令:退出vim编辑器,强制退出在前加!
!q
#x 命令:等同于wq命令,先保存文档后退出vim
二.Shell编程
- Shell是管理命令行的程序,是用户与操作系统间的桥梁
- chsh (Change Shell) 命令可以切换Shell
第一个Shell脚本
1 | #先创建一个Shell文本文件 |
调试程序
1 | #-x:以调试模式运行 |
将脚本放置在PATH变量中
1 | #先查看当前的PATH系统变量 |
Shell变量
举例:
1 | message='Hello World' |
echo命令:显示
1
2
3
4
5
6
7
8#将"hello"显示出来
echo "hello"
#插入换行符:-e与\n
echo -e "First Line\nSecond Line"
#脚本中显示变量:$与变量名
echo $message根据引号类型,Bash的处理方式也不同
看一下例子增强理解:
1
2
3
4
5
6
7message='Hello'
echo "The message is $message"
输出结果:The message is Hello
message=`pwd`
echo "The directory is $message"
输出结果:The directory is /home/mingread 命令:请求输入
1
2
3
4
5
6
7
8
9
10
11
12
13#请求用户在终端中输入,可以输入多个变量
read firstname secondname
echo "Hello $firstname,$secondname!"
#-p:提示信息
read -p 'Please enter name:' name
echo "Hello $name!"
#-n:限制字符数目(8个字符为例)
read -p 'Please enter name:' -n 8 name
#-t;限制输入时间(秒)
#-s:输入隐藏内容(例如密码)Shell的数学运算
let 命令:赋值
1
2
3
4
5
6
7let "a=1"
let "b=8"
let "c=a+b"
echo "c=$c"
#其余的运算与其他编程语言类似,不过多阐述
#比较特殊的运算符:幂次方(**),2的8次方示例:2**8Shell的环境变量
env 命令:显示所有环境变量
SHELL:表示目前所用的Shell
PATH:一系列路径的合集,脚本存放于这些路径可在任何目录直接执行
HOME:家目录路径
PWD:目前所在路径
export name[=word]
Shell的参数变量
列举多变量
1 | ./variable.sh param1 param2 param3 |
上述命令列举了多个参数,并使用以下属性
1 | $#:参数的数目 |
shift 命令:变量移位
1 | echo "The first param is $1" |
使用shift命令后,$1对应第2个参数,$2对应第3个参数,以此类推
数组
1 | !/bin/bash |
以上案例展示了如何定义数组,给数组赋值,显示数组的值,若要一次显示数组中所有值,可以使用通配符: echo ${array[*]}
Shell的选择语句
- if-else语句
1 | #!/bin/bash |
Shell的条件测试
- 测试字符串
条件 | 描述 |
---|---|
$string1 = $string2 | 两个字符串是否相等 (区分大小写) |
$string1 != $string2 | 两个字符串是否不相等 |
-z $string | 字符串是否为空 (zero),返回布尔类型 |
-n $string | 字符串是否不为空 (not),返回布尔类型 |
- 测试数字
条件 | 意义 |
---|---|
$num1 -eq $num2 | 是否相等(equal) |
$num1 -ne $num2 | 是否不相等(not equal) |
$num1 -lt $num2 | num1是否小于num2(lower than) |
$num1 -le $num2 | num1是否≤num2(lower or equal) |
$num1 -gt $num2 | num1是否大于num2(greater than) |
$num1 -ge $num2 | num1是否≥num2(greater or equal) |
- 测试文件
条件 | 意义 |
---|---|
-e $file | 文件是否存在(exist) |
-d $file | 是否为一个目录(directory) |
-f $file | 是否为一个文件(file) |
-L $file | 是否为一个链接文件 |
-r/w/x $file | 是否可读/可写/可执行 |
$file1 -nt $file2 | 文件file1是否比file2新 |
$file1 -ot $file2 | 文件file1是否比file2旧 |
逻辑与(&&)、逻辑或(||)、非(!)
case:测试多个条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#!/bin/bash
case $1 in
"Tim" | "Tom")
echo "Hello, Tim or Tom!"
;;
"Marry")
echo "Hello, Marry!"
;;
"Zach")
echo "Hello, Zach!"
;;
*)
echo "I don't know you!"
;;
esac- ;; 相当于主流编程语言中的break
- *) 相当于else
- 注意:case语句中的或是一个竖杠,不是两个
Shell循环语句
while循环
1
2
3
4
5
6
7
8while [ 条件 ]
do
...
done
while [ 条件 ]; do
...
doneuntil循环
1
2
3
4until [ 条件 ]
do
...
donefor循环-遍历列表
1
2
3
4for 变量 in 'value1' 'value2' ... 'valueN'
do
...
done使用举例:
1
2
3
4
5
6#!/bin/bash
for file in `ls`
do
echo "File found : $file"
donefor循环-常规
1
2
3
4
5
6
7
8
9
10
11for i in `seq 1 10`
do
echo $i
done
#以上代码会输出i的值(1-10)
for i in `seq 1 2 10`
do
echo $i
done
#以上代码输出i的值(1-10,间隔为2,即1,3,5,7,9)
Shell函数
定义
1
2
3
4
5
6
7函数名 () {
...
}
function 函数名 {
...
}传递参数
1
2
3
4
5
6
7
8
9
10
11
12#!/bin/bash
print () {
echo "Hello, $1"
}
print Marry
print Zach
输出结果:
Hello, Marry
Hello, Zach返回值( $? 代表上一次命令运行的返回状态)
1
2
3
4
5
6
7
8
9#!/bin/bash
print () {
echo Hello $1
return 1
}
print Zach
echo "Return value of previous function is $?"全局变量(global)与局部(local)变量
1
2
3
4
5
6
7
8
9
10
11#!/bin/bash
local_global () {
local var1='local 1'
var1='new local 1' #此处var1为函数内定义的局部变量
var2='global 2' #此处var2为函数外定义的全局变量
}
var1='global 1'
var2='global 2'
local_global重载命令
1
2
3
4
5
6
7#!/bin/bash
ls () {
command ls -lh
}
ls
#注意:如果没有command这个关键字,程序会陷入无限循环
到这里为止,Linux学习之旅(基础)就告一段落了,现在我们可以掌握Linux的常用操作和Shell编程的基础了,日后一定要多回顾知识,多加练习,早日成为精通Linux的大神!!!