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/ming -
read 命令:请求输入
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**8
Shell的环境变量
-
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
...
done -
until循环
1
2
3
4until [ 条件 ]
do
...
done -
for循环-遍历列表
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"
done -
for循环-常规
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的大神!!!