vim编辑器
在 LInux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在的,因此利用简单的文字编辑软件就可以修改配置了
基本上 vi 共分为三种模式:一般指令模式、编辑模式、指令列命令模式
-
一般指令模式(command mode)
以 vi 打开一个文件就直接进入一般指令模式了(默认模式,也简称一般模式)。
在该模式中,可以使用「上下左右」按键移动光标,可以使用「删除字符」或「删除整列」来处理文件内容,也可以使用「复制、粘贴」
-
编辑模式(insert mode)
在一般模式中可以进行删除、复制、粘贴等动作,但是无法编辑文件内容。
需要按下「i、I、o、O、a、A、r、R」等任意按键后才会进入编辑模式,通常会在左下方出现 INSERT 或 REPLACE 的字样,可以通过 esc 按键退出编辑模式,回到一般指令模式
-
指令列命令模式(commadn-line mode)
在一般模式中,输入「:、/、?」任意字符,则光标会移动到最底下的一列。
在这个模式中,可以提供你搜索、读取、存盘、大量取代字符、离开 vi、显示行号等功能、
bash解释器
管理整个计算机硬件的其实是操作系统的核心(kernel),一般使用者只能通过 shell 来与核心沟通。bash具体都有哪些功能?那么有系统有多少 shell 可用呢?以及为什么要使用 bash?
bash 的功能主要有
- 命令编修能力
- 命令与文件补全功能
- 命令别名设置功能
- 工作控制、前景背景控制
- 程序化脚本
- 通配符
什么是shell
操作系统其实是一组软件,控制整个硬件与管理系统的活动检测,如果这组软件能被用户随意的操作,若使用者应用不当,将会使得整个系统崩溃!所以不能随便被一些没有管理能力的终端用户随意使用
但是可以考虑使用程序来指挥核心,可以发现应用程序其实是在最外层,就如同鸡蛋的外壳一样,因此也就被称呼为壳程序(Shell)
其实壳程序的功能只是提供用户操作系统的一个接口,因此整个壳程序需要可以呼叫其他软件的功能,如前面提到过的很多指令,包括 man、chmod、chown、vi、fdisk、mkfs 等指令,这些指令都是独立的应用程序,但是可以通过壳程序(指令行模式)来操作这些应用程序
为什么要学习shell呢
- 文字接口的 shell 在各大 distribution 都一样
- 远程管理时,文字接口速度较快
- shell 是管理 linux 系统非常重要的一环,因为 linux 内很多控制都是以 shell 撰写的
shell运行的过程
shell解释的过程
设置别名
alis
命令可以帮助我们给命令设置别名,方便我们更好的使用命令
可以通过alis
来查看目前机器设置的别名
[root@localhost demo1]# alias
alias c='clear'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
也可以自己设置别名 和取消别名
# 这里使用 lm 取代了 ls -al
alias lm='ls -al'
#或者可以使用c代替clear
alias c=clear
#取消别名
[root@localhost demo1]# unalias c
[root@localhost demo1]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
通配符
可以进行模糊匹配,比如可以想要知道 /usr/bin 下有多少以 X 开头的文件,使用ls -l /usr/bin/X*
就可以知道
*匹配任意字符
?匹配1个字符
举例
[root@localhost demo1]# ll /usr/bin/mkdir*
-rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
[root@localhost demo1]# ll /usr/bin/mkdi?
-rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
shell变量
什么是变量?
简单说,某一个特定字符串代表不固定的内容;比如:y = ax+b
等号左边的是变量,右边的是变量的内容,使用简单的变量来取代另一个比较复杂或则是容易变动的数据,这样做的好处就是方便!
特殊符号
学习变量知识,我们首先要认识Linux中的特殊符号,特殊符号经常与变量等结合使用
$符号
- $?上一个命令的退出状态(若为0:表示成功;不是0,表示失败),或者上一个函数的返回值,但是有两个注意点:函数一结束就取返回值;退出状态码必须是-0~255,否则就使用命令替换获取返回值或者定义一个变量(shell的文件级和函数中定义的变量默认都是全局变量)
- $#表示脚本中参数的个数
- $*表示获取所有对应参数的值
- $n表示为(n>=1)的参数
- $0表示脚本名
- $@表示获取所有对应参数的值
- $$ 表示Shell本身的PID(ProcessID)
分号
在脚本中,分号
是多个语句之间的分隔符号
,当只有一个语句的时候,末尾无需分号
,最后一个语句后面也无需分号
,否则报错
在交互式命令中,用分号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行,例如:command1 ; command2
实际应用
#这是脚本
#/bin/bash
echo 这是脚本名字:$0
echo 总共有$#个人,分别是$*
echo 第一个人是$1,第二个人是$2
#脚本运行结果
[root@localhost demo1]# bash test1.sh 张三 李四
这是脚本名字:test1.sh
总共有2个人,分别是张三 李四
第一个人是张三,第二个人是李四
引号
单引号 是原始字符串,属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用,唯一需要注意的点是不允许引用自身
双引号 可以对特殊字符进行扩展, 属于弱引用,它会对一些被引起来的字符进行特殊处理。双引号与单引号的区别在于其可以包含特殊字符(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符),包括’, ", $, ,如果要忽略特殊字符,就可以利用\来转义,忽略特殊字符,作为普通字符输出
具体效果可以看下面变量的取用章节
变量的应用
- echo可以取出变量的值,通常有以下两种方式,推荐使用第2种方式
echo $PATH
echo ${PATH} # 推荐使用这种方式取用
或者配合符号取用,比如使用单引号和双引号与echo配合就会有不同的结果
[root@localhost demo1]# a=10
#单引号
[root@localhost demo1]# echo '这是一个变量$a'
这是一个变量$a
#双引号
[root@localhost demo1]# echo "这是一个变量$a"
这是一个变量10
#不加引号
[root@localhost demo1]# echo 这是一个变量$a
这是一个变量10
#加大括号
[root@localhost demo1]# echo 这是一个变量${a}
这是一个变量10
通过以上结果我们可以发现,当echo配合单引号使用的时候,就是是什么就输出什么,不会取出其中变量的值,而使用双引号的时候则会取出变量的值
命令替换
另外还可以通过以下两种方式从命令中提取信息将其赋值给变量。
- 反引号字符(`)
- $()格式
$( )
和反引号```(tab
按键上面) 作用相同:命令替换
[root@localhost demo1]# echo $(date)
2023年 02月 25日 星期六 22:06:43 CST
[root@localhost demo1]# echo `date`
2023年 02月 25日 星期六 22:06:49 CST
数值运算
$(( ))
是整数数值运算,也可用(( ))
代替- 另
$[ ]
也是进行数学运算的,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ]
)将数学表达式围起来
[root@localhost demo1]# echo $((1+2))
3
[root@localhost demo1]# echo $[1+2]
3
重定向
> 或 1> | 把正确的进行输出(标准输出),覆盖 |
---|---|
>> 或 1>> | 把正确的进行输出(标准输出),追加 |
2> | 把错误的进行输出,覆盖 |
2>> | 把错误的进行输出,追加 |
&> | 合并正确和错误输出,覆盖重定向 |
&>> | 合并正确和错误输出,追加重定向 |
实际应用
#把正确的进行输出
[root@localhost demo1]# echo 12345 >test.txt
[root@localhost demo1]# cat test.txt
12345
[root@localhost demo1]# echo changsha >test.txt
[root@localhost demo1]# cat test.txt
changsha
[root@localhost demo1]# echo 12345 >>test.txt
[root@localhost demo1]# cat test.txt
changsha
12345
#把错误的进行输出
[root@localhost lianxi]# echo 123 2>test.txt
123
[root@localhost lianxi]# cat test.txt
[root@localhost lianxi]# awdad 2>test.txt
[root@localhost lianxi]# cat test.txt
-bash: awdad: 未找到命令
[root@localhost lianxi]# sdawaf >test.txt
-bash: sdawaf: 未找到命令
#不论对错都进行输出
[root@localhost demo1]# echo 1234 &>>test.txt
[root@localhost demo1]# dasd &>>test.txt
[root@localhost demo1]# cat test.txt
0
1234
-bash: dasd: 未找到命令
/dev/null 垃圾桶黑洞装置的特殊写法
就是可以将任何信息吃掉的黑洞装置
[root@localhost demo1]# sadas 2>>/dev/null
[root@localhost demo1]# echo 12324 >/dev/null
#不论对错 都不会输出信息 常用来去除不必要的输出
逻辑操作符
&&
:前一个执行正确,后面才会执行||
:前一个执行正确,后面的不会执行
此处就不做赘述了
历史命令:history
history 用来查询曾经下达过的指令
history [n]
history [-c]
history [-raw] histfiles
正常情况下历史命令的读取记录是这样的:
- 当以 bash 登录 Linux 主机后,系统会主动的由家目录的
~/.bash_history
读取 - 假设这次登录后,共下达过 100 次命令,等你注销时,系统就会将 101~1100 总共 1000 条记录更新到
~/.bash_history
中,因为和能存储最大条数 HISTSIZE 有关系,前面的序号会增加,但是总存储条数只有 HISTSIZE 条 - 也可以使用 history -w 强制写入
选项与参数:
- n:数字,列出最近 n 条命令
- c:将目前的 shell 中的所有 history 内容全部消除
- !:
- !number 执行第几条历史命令
- !command 执行最近一条的命令
[mrcode@study ~]$ history 4
681 man rm
682 alias
683 man history
684 history 4
[mrcode@study ~]$ !681 # 执行第 681 条指令
man rm # 这里会显示具体执行的指令是什么
[mrcode@study ~]$ !! # 执行上一个指令
man rm
[mrcode@study ~]$ !al # 从最新的历史指令开始搜索 al 开头的指令并执行他
alias