一、Linux文本编辑
vi的三种模式 命令行模式 插入模式 底行模式
1、命令行模式
设置vi set nu 显示行号
set ruler 显示光标位置
set nudolevel 显示光标位置
set smartindent 智能缩进
syntax on(或sun on) 语法高亮
开始编辑命令: a 在光标后输入文本
A 在当前行末尾输入文本
i 在光标前输入文本
I 在当前行开始输入文本
o 在当前行后输入新一行
O 在当前行前输入新一行
删除命令: x 删除光标所在的字符
dd 删除当前行
ndd 删除当前行开始的n行
改变与替换操作命令:r 替换光标所在的字符
R 替换字符序列
c$ 替换自光标位置至行尾的所有字符
C 同c$
cc 替换当前行
查询命令: /abc 向后查询abc
?abc 向前查询abc
n 向后继续查询
N 向前继续查询
拷贝和粘贴命令:/yw 将光标所在单词拷入剪贴板
y$ 将光标至行尾的字符拷入剪贴板
Y 同y$
yy 将当前行拷入剪贴板
nyy 复制当前开始往后的n行
p 将剪贴板中的内容粘贴在光标后
P 将剪贴板中的内容粘贴在光标前
文件保存及退出命令::q 不保存退出
:q! 不保存强制性退出
:w 保存编辑
:w filename 保存到文件 filename 中
:w! filename 强制性存入文件 filename 中
:wq 保存退出
:x 同 :wq
ZZ 同 :wq
其他命令: nG 跳到第n行
G 跳到最后一行
gg 跳到第一行
u 撤销
. 重做
:s/old/new 替该该行第一个old为new
:s/old/new/g 可以替换全行中所有的old为new
:#,#s/old/new/g 替换两行之间出现的old为new,#,#为两行的行号
:%s/old/new/g 或者 1,$s/old/new/g 替换全文的old为new
:%s/old/new/gc 全文替换前需确认
2、插入模式:在命令模式下输入(i,I,o,O,a,A等),可进入输入模式,输入模式下按ESC,可返回命令模式。
3、底行模式:将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号等。
二、shell脚本基础
1、shell基本元素:
(1)#! /bin/bash 必须的,指出shell的类型
(2)# 注释
(3)变量
(4)控制
2、shell脚本: shell可以读取这个文件并执行其中的命令。这样的文件被称为脚本文件。
3、创建和执行: 用任何编辑器比如vi在文本文件中编写脚本,以.sh为后缀名保存文件。
将文件赋予可执行的权限
执行脚本命令:
1)bash 文件名 bash run.sh
2) ./文件名 在当前目录下写明路径执行,要求文件必须有执行权限 chmod 755 run.sh ./run.sh
echo 要显示的内容 用于在屏幕上显示消息
# 用于在shell脚本中进行注释
4、shell中的特殊符号:
反斜线\ 反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
美元符$ 与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来。
单引号'' 被引起的字符全部做普通字符,即全部原样。
双引号"" 引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
倒引号`` 引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
5、变量: 局部变量:
赋值:本地变量 在用户现在的shell生命期的脚本中使用
变量名=值 declare -i 变量名
注意:
(1)等号两边不可以有空格
(2)取值包含空格,必须用双引号括起来
(3)Shell变量可以用大小写字母,区分大小写
使用: $变量名
${变量名}
变量名为1个字符时建议使用方式一,多余一个字符时建议使用方式二
引用:变量名=${变量名}
显示变量: echo命令可以显示单个变量取值,变量名前加$
清除变量: unset 变量名
设置只读变量: readonly 变量名 readonly 变量名=值
环境变量:
env 显示所有的环境变量
export 变量名 把变量变成全局变量
echo $环境变量名 显示一个变量
内部变量: 这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
$# 传送给shell程序的位置参数的数量
$? 最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0 shell程序的名称
$* 调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数
$n 第n个参数
6、变量表达式:
expr 值+值 将在屏幕上显示两值之和
$((.....)) 可以在$((...))中包括一个表达式
条件判断命令: test n1 -参数 n2 或 test 表达式 -参数 表达式
或[ n1 -参数 n2 ] 真返回0,假返回1(切记空格)
参数:
-lt(less than) 小于
-le(less than or equalto) 小于等于
-gt(greet than) 大于
-ge(greet than or equal to) 大于等于
-eq(equal to) 等于
-ne(not equal to) 不等于
文件测试: test -参数 "文件" [ -参数 "文件名" ]
参数: -f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
字符串测试: test s 字符串s非空
test s1=s2 字符串s1等于s2
test s1!=s2 字符串s1不等于s2
test -z s 字符串长=0,即为空串
test -n s 字符串长>0
=: 等于则为真
!=: 不相等则为真
-z字符串: 字符串长度为零则为真
-n字符串: 字符串长度不为零则为真
其他参数:
与 或 非
&& || !
-a -o !
[ n1 -gt n2 -o n1 -eq n2 ]
7、控制流程
分支语句:
if: if [ $# -eq 0 ]
then
echo "输入了0个参数"
elif [ $# -gt 1 ]
then
echo "输入了多个参数"
else
echo "输入了1个参数"
fi
case: case "$#" in
0) echo "输入了0个参数" ;;
1) echo "输入了1个参数" ;;
*) echo "输入了多个参数";;
esac
每个分支条件后必须以两个分号结尾
循环语句:
while: 只有条件为真时,就执行do和done之间的命令
while <条件>
do
<命令(s)>
done
while例子——求1到100的和
declare -i i=1
sum=0
while [ $i –le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
for: for循环取一列值作为输入并对循环中每个值执行循环
for variable_name in <list_of_values>
do
...
done
for例子——1到9都乘10后输出
for i in `seq 1 9`
do
echo `expr $i \* 10` 或写 echo $(expr $i \* 10) 乘号前加转义符,与数字间要有空格。
done
until: 循环模式与while循环相反,执行循环体直到条件为真
until <条件>
do
<命令(s)>
done
break: 结束全部循环 continue:结束本次循环进入下次循环
8、read变量: 在执行shell脚本时,shell还允许用户从键盘中输入一个值给变量。可以使用read命令来做。
read name
read 变量1 [变量2 …] 可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
例: 输出a到b序列数各数的10倍数
read a b
for i in `seq $a $b`
do
echo `expr $i \* 10`
done
9、命令结果重定向:
(1) cp /etc/my.conf >/dev/null 2>&1
/dev/null 空设备 垃圾箱
此句命令的结果是:
cp命令没有目标文件,应该输出错误。
2>&1表示错误重定向指向标准输出。两个输出输出到一个地方。
>/dev/null又使标准输出重定向到垃圾箱,就是不要输出信息
(2) 1)command >file 2>file
2)command >file 2>&1
有什么区别?
1)的写法,stdout(标准输出)和stderr(标准错误)都直接送到file中, 会出现两个同抢占file的管道,file会被打开两次,stdout和stderr输出的信息会互相覆盖。
2)的写法将stdout直接送向file, stderr继承1的管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,常用command > file 2>&1 这样的写法。
(3) cat <file1>file2 file1读入数据然后写入file2
cat <file>file 文件內容会被洗掉
cat file 此处会没有内容
stdout、stderr 的管道先准备好才会从stdin读内容
> file 会先清空 file,然後才读进 < file ,但此时file已被清空,因此再重定位读进file的为空,最后cat显示的file就成空了
10、计算命令的开始到结束之间的时间
time find /etc -name "passwd" 2>/dev/null 计算寻找etc目录下的passwd文件并将标准错误输出到垃圾箱的时间
11、管道
垂直条(|)是管道字符,它指示shell:'|'前面的命令的输出作为'|'之后命令的输入发送
vi的三种模式 命令行模式 插入模式 底行模式
1、命令行模式
设置vi set nu 显示行号
set ruler 显示光标位置
set nudolevel 显示光标位置
set smartindent 智能缩进
syntax on(或sun on) 语法高亮
开始编辑命令: a 在光标后输入文本
A 在当前行末尾输入文本
i 在光标前输入文本
I 在当前行开始输入文本
o 在当前行后输入新一行
O 在当前行前输入新一行
删除命令: x 删除光标所在的字符
dd 删除当前行
ndd 删除当前行开始的n行
改变与替换操作命令:r 替换光标所在的字符
R 替换字符序列
c$ 替换自光标位置至行尾的所有字符
C 同c$
cc 替换当前行
查询命令: /abc 向后查询abc
?abc 向前查询abc
n 向后继续查询
N 向前继续查询
拷贝和粘贴命令:/yw 将光标所在单词拷入剪贴板
y$ 将光标至行尾的字符拷入剪贴板
Y 同y$
yy 将当前行拷入剪贴板
nyy 复制当前开始往后的n行
p 将剪贴板中的内容粘贴在光标后
P 将剪贴板中的内容粘贴在光标前
文件保存及退出命令::q 不保存退出
:q! 不保存强制性退出
:w 保存编辑
:w filename 保存到文件 filename 中
:w! filename 强制性存入文件 filename 中
:wq 保存退出
:x 同 :wq
ZZ 同 :wq
其他命令: nG 跳到第n行
G 跳到最后一行
gg 跳到第一行
u 撤销
. 重做
:s/old/new 替该该行第一个old为new
:s/old/new/g 可以替换全行中所有的old为new
:#,#s/old/new/g 替换两行之间出现的old为new,#,#为两行的行号
:%s/old/new/g 或者 1,$s/old/new/g 替换全文的old为new
:%s/old/new/gc 全文替换前需确认
2、插入模式:在命令模式下输入(i,I,o,O,a,A等),可进入输入模式,输入模式下按ESC,可返回命令模式。
3、底行模式:将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号等。
二、shell脚本基础
1、shell基本元素:
(1)#! /bin/bash 必须的,指出shell的类型
(2)# 注释
(3)变量
(4)控制
2、shell脚本: shell可以读取这个文件并执行其中的命令。这样的文件被称为脚本文件。
3、创建和执行: 用任何编辑器比如vi在文本文件中编写脚本,以.sh为后缀名保存文件。
将文件赋予可执行的权限
执行脚本命令:
1)bash 文件名 bash run.sh
2) ./文件名 在当前目录下写明路径执行,要求文件必须有执行权限 chmod 755 run.sh ./run.sh
echo 要显示的内容 用于在屏幕上显示消息
# 用于在shell脚本中进行注释
4、shell中的特殊符号:
反斜线\ 反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
美元符$ 与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来。
单引号'' 被引起的字符全部做普通字符,即全部原样。
双引号"" 引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
倒引号`` 引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
5、变量: 局部变量:
赋值:本地变量 在用户现在的shell生命期的脚本中使用
变量名=值 declare -i 变量名
注意:
(1)等号两边不可以有空格
(2)取值包含空格,必须用双引号括起来
(3)Shell变量可以用大小写字母,区分大小写
使用: $变量名
${变量名}
变量名为1个字符时建议使用方式一,多余一个字符时建议使用方式二
引用:变量名=${变量名}
显示变量: echo命令可以显示单个变量取值,变量名前加$
清除变量: unset 变量名
设置只读变量: readonly 变量名 readonly 变量名=值
环境变量:
env 显示所有的环境变量
export 变量名 把变量变成全局变量
echo $环境变量名 显示一个变量
内部变量: 这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
$# 传送给shell程序的位置参数的数量
$? 最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0 shell程序的名称
$* 调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数
$n 第n个参数
6、变量表达式:
expr 值+值 将在屏幕上显示两值之和
$((.....)) 可以在$((...))中包括一个表达式
条件判断命令: test n1 -参数 n2 或 test 表达式 -参数 表达式
或[ n1 -参数 n2 ] 真返回0,假返回1(切记空格)
参数:
-lt(less than) 小于
-le(less than or equalto) 小于等于
-gt(greet than) 大于
-ge(greet than or equal to) 大于等于
-eq(equal to) 等于
-ne(not equal to) 不等于
文件测试: test -参数 "文件" [ -参数 "文件名" ]
参数: -f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
字符串测试: test s 字符串s非空
test s1=s2 字符串s1等于s2
test s1!=s2 字符串s1不等于s2
test -z s 字符串长=0,即为空串
test -n s 字符串长>0
=: 等于则为真
!=: 不相等则为真
-z字符串: 字符串长度为零则为真
-n字符串: 字符串长度不为零则为真
其他参数:
与 或 非
&& || !
-a -o !
[ n1 -gt n2 -o n1 -eq n2 ]
7、控制流程
分支语句:
if: if [ $# -eq 0 ]
then
echo "输入了0个参数"
elif [ $# -gt 1 ]
then
echo "输入了多个参数"
else
echo "输入了1个参数"
fi
case: case "$#" in
0) echo "输入了0个参数" ;;
1) echo "输入了1个参数" ;;
*) echo "输入了多个参数";;
esac
每个分支条件后必须以两个分号结尾
循环语句:
while: 只有条件为真时,就执行do和done之间的命令
while <条件>
do
<命令(s)>
done
while例子——求1到100的和
declare -i i=1
sum=0
while [ $i –le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
for: for循环取一列值作为输入并对循环中每个值执行循环
for variable_name in <list_of_values>
do
...
done
for例子——1到9都乘10后输出
for i in `seq 1 9`
do
echo `expr $i \* 10` 或写 echo $(expr $i \* 10) 乘号前加转义符,与数字间要有空格。
done
until: 循环模式与while循环相反,执行循环体直到条件为真
until <条件>
do
<命令(s)>
done
break: 结束全部循环 continue:结束本次循环进入下次循环
8、read变量: 在执行shell脚本时,shell还允许用户从键盘中输入一个值给变量。可以使用read命令来做。
read name
read 变量1 [变量2 …] 可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
例: 输出a到b序列数各数的10倍数
read a b
for i in `seq $a $b`
do
echo `expr $i \* 10`
done
9、命令结果重定向:
(1) cp /etc/my.conf >/dev/null 2>&1
/dev/null 空设备 垃圾箱
此句命令的结果是:
cp命令没有目标文件,应该输出错误。
2>&1表示错误重定向指向标准输出。两个输出输出到一个地方。
>/dev/null又使标准输出重定向到垃圾箱,就是不要输出信息
(2) 1)command >file 2>file
2)command >file 2>&1
有什么区别?
1)的写法,stdout(标准输出)和stderr(标准错误)都直接送到file中, 会出现两个同抢占file的管道,file会被打开两次,stdout和stderr输出的信息会互相覆盖。
2)的写法将stdout直接送向file, stderr继承1的管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,常用command > file 2>&1 这样的写法。
(3) cat <file1>file2 file1读入数据然后写入file2
cat <file>file 文件內容会被洗掉
cat file 此处会没有内容
stdout、stderr 的管道先准备好才会从stdin读内容
> file 会先清空 file,然後才读进 < file ,但此时file已被清空,因此再重定位读进file的为空,最后cat显示的file就成空了
10、计算命令的开始到结束之间的时间
time find /etc -name "passwd" 2>/dev/null 计算寻找etc目录下的passwd文件并将标准错误输出到垃圾箱的时间
11、管道
垂直条(|)是管道字符,它指示shell:'|'前面的命令的输出作为'|'之后命令的输入发送
ls -l | more
12、命令聚合:
CMD1;CMD2;CMD3;CMD4 依次执行CMD1~CMD4指令
CMD1&&CMD2 CMD1执行成功才执行CMD2
CMD1||CMD2 CMD2执行失败才执行CMD2