第一天笔记
核心是“标准流(Standard Streams)” 的概念,用于描述进程如何与外部(如键盘、屏幕、文件)进行数据交互。变量用于保存字符串值,便于后续引用,变量值存储在当前会话内存中。变量名只能包含:字母数字下划线变量名不能以数字开头。shell中变量的类型,一般不需要明确指明。# 变量定义# 标准格式如下# 使用$引用变量值key1# 示例2# 使用多个空格,效果一样# 使用引号保留多个空格fa
第一天笔记
vim编辑器
vim编辑器介绍
每一个系统管理员都有一个偏爱的文本编辑器。有的管理员偏爱gedit,有的偏爱nano,甚至有的偏爱emacs。即使已经有偏爱的编辑器,了解vim还是有必要的。因为vim可以安装在任何系统。
vim版本,Linux 系统中可以安装vim三个不同版本:
vim-minimal:只提供vi和相关命令。
vim-enhanced:提供vim命令,提供语法高亮,拼写检查等特性。
vim-X11:提供gvim,图形界面下的vim。gvim包涵菜单栏。当用户不知道命令的时候,可以通过菜单操作。
# 安装 vim 工具
[root@centos7 ~]# yum install vim
vim 模式
-
command 模式:该模式下键盘中的字母有特殊含义。例如G,跳转到最后一行;gg,跳转到第一行。
-
edit 模式:在 command 模式下按 i ,进入该模式。在该模式可以输入内容。在该模式下按Esc 返回 command 模式。
-
extended command 模式:在 command 模式下按 : ,进入该模式。在该模式下,可以保存文件(:w),退出编辑(:q),强制退出编辑(:q!),报错并退出(:wq)。
-
visual edit 模式:在 command 模式下按 v(单个字符选中)、V(整行选中)或者ctrl+v(按矩形选中),进入该模式。在该模式下,用于选中文件,随后可以复制或删除选中的内容。
[laoma@centos7 ~]$ cp /etc/profile ./profile.sh
[laoma@centos7 ~]$ vim ./profile.sh
命令行模式快捷键
定位文件内容
-
w ,向后1个word(光标在单词开头); e ,向后1个word(光标在单词末尾)
-
b ,向前1个word
-
^ 或 0 ,行首
-
$ ,行尾
-
( ,上一个句子头部; ) ,下一个句子尾部。
-
{ ,上一个自然段; } ,下一个自然段。
-
gg ,第一行; G ,最后一行。
进入插入模式
-
i ,当前位置插入。(insert)
-
I,行首插入。
-
a,当前位置追加。(append)
-
A,行末追加。
-
o,向下新开一个空白行。
-
O,向上新开一个空白行。
复制:yy,复制1行,相当于y1y。以此类推 y2y y2w y2b。
粘贴:p 当前位置后粘贴,P 当前位置前粘贴
删除:
-
x,删除当前单个字符。5x,删除当前字符和后续4个字符。
-
X,删除前一单个字符。
-
dw,删除1个word,以此类推 d5w d3b d2d d$。
-
D,从当前删除到最后,相当于d$。
回退:
-
u,撤销上一个操作。
-
U,撤销整行修改。
修改,相当于删除后插入:
-
s,删除当前字符,并进入编辑模式。
-
S,删除当前行,并进入编辑模式。
-
c,代表替换动作,例如cw,删除1个word,并进入编辑模式。以此类推 c5w。
-
C,从当前删除到最后,并进入编辑模式。
替换:
-
r,替换单个字符后回退到命令行模式。
-
R,替换模式,一直替换直到按 Ese 返回命令行模式。
vim 配置
两个位置:
-
全局: /etc/vimrc ,给所有用户设置一些默认值。
-
用户: ~/.vimrc ,特定用户的个性化设置。
常见的设置命令:
[laoma@centos7 ~]$ vim ~/.vimrc
set number
set showcmd
set ai ts=2
set cursorcolumn
set cursorline
# 参数说明:
# 显示行号 set number
# 显示操作命令 set showcmd
# ai,自动缩进;ts,tabspace使用2个空格代替 set ai ts=2
# 列高亮对齐显示 set cursorcolumn
# 行高亮对齐显示 set cursorline
Linux输入输出重定向
Linux输入输出重定向介绍
核心是“标准流(Standard Streams)” 的概念,用于描述进程如何与外部(如键盘、屏幕、文件)进行数据交互。
标准流的核心组成
stdin**(标准输入,编号** 0**)**:
-
是进程接收输入数据的通道,默认连接到键盘,程序通过它读取用户输入(如scanf 、 read 等操作会从 stdin 获取数据)。
-
用法为仅读取(只能从该通道输入数据到进程)。
stdout**(标准输出,编号** 1**)**:
-
是进程输出正常结果的通道,默认连接到终端屏幕,程序的普通打印(如 printf 、echo 等)会输出到 stdout 。
-
用法为仅写入(进程只能向该通道输出数据)。
stderr**(标准错误,编号** 2**)**:
-
是进程输出错误信息的通道,默认也连接到终端屏幕,用于区分正常输出和错误提示(如程序崩溃、逻辑错误的提示信息)。
-
用法为仅写入(专门用于输出错误内容)。
3+ 号通道(其他文件,filename):
-
代表进程与自定义文件的交互通道(非标准流),没有默认连接,需要手动指定文件。
-
用法为读取和 / 或写入(可根据需求对文件进行读、写操作)。
流程逻辑
-
输入:用户通过键盘向 stdin 输入数据,进程从 stdin 读取这些输入。
-
输出:进程将正常结果写入 stdout ,错误信息写入 stderr ,两者默认都显示在终端;同时,进程也可通过 3+ 号通道与其他文件进行数据的读写交互。
标准输出重定向到文件

# 查找 /etc 目录下 文件名是passwd的所有文件
[laoma@centos7 ~]$ find /etc -name 'passwd'
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
/etc/pam.d/passwd
/etc/passwd
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
.......
# 将找到的文件名清单覆盖写入到passwd.list文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 1>passwd.list
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
# 补充说明
# 1>passwd.list可简写为>passwd.list
# 1和>之间不能有空格
# 将多个文件内容合并为1个
[laoma@centos7 ~]$ cat /etc/fstab /etc/hosts > allinone
# 将找到的文件名清单追加写入到passwd.list文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 1>>passwd.list
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
# 将错误信息覆盖写入到passwd.err文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>passwd.err
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.err
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
# 将错误信息扔掉
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null
/etc/pam.d/passwd
/etc/passwd
# 将错误信息追加写入到passwd.err文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>>passwd.err
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.err
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
# 将错误信息、正确信息 覆盖 写入到不同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' >passwd.list 2>passwd.err
# 将错误信息、正确信息 追加 写入到不同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' >>passwd.list 2>>passwd.err
# 用于清空文件内容,也可用于创建一个空文件testfile
[laoma@centos7 ~]$ > testfile
[laoma@centos7 ~]$ >> testfile

# 同时将错误信息、正确信息 覆盖 写入到相同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' &> passwd.all
# 同时将错误信息、正确信息 追加 写入到相同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' &>> passwd.all
标准输出重定向到程序
管道符(|)实现,将上一个命令的输出作为标准输入传递给下一个命令。
# 示例1 查看哪个man page 可以resize ext4文件系统大小
# 搜索所有ext4相关手册,并保存到ext4.man文件中
[laoma@centos7 ~]$ man -k ext4 > ext4.man
# 过滤ext4.man文件中含有resize的行
[laoma@centos7 ~]$ grep resizer ext4.man
# 以上两个命令和合并为一行
[laoma@centos7 ~]$ man -k ext4 | grep resizer
resize2fs (8) - ext2/ext3/ext4 file system resizer
**注意:**管道符号后的命令必须能够接收标准输入,例如 ls 不接收管道传递过来的标准输入。
tee命令
tee 命令作用,接收管道传递过来的stdin,并继续作为stdout输出。
[laoma@centos7 ~]$ > passwd.list
[laoma@centos7 ~]$ cat passwd.list
# tee命令覆盖保存到文件
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null | tee
passwd.list
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
# tee命令追加保存到文件
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null |tee -a
passwd.list
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
# tee的标准输出继续通过管道传递下去
[laoma@centos7 ~]$ man -k passwd | tee passwd.man | grep passwd
标准输入重定向给程序
# 常规查看文件
[laoma@centos7 ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
# cat 命令标准输入数据
[laoma@centos7 ~]$ cat < /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain
[laoma@centos7 ~]$ cat
hello # 键盘输入hello后回车
hello # 屏幕上显示hello
ctrl+d # 输入完成,退出
# shell读取到EOF时候,代表标准输入完成
[student@servera ~]$ cat << EOF
> hello
> world
> EOF
hello
world
[laoma@centos7 ~]$ cat <<< 'hello world'
hello world
判定一个命令是否接收标准输入:最简单的方式就是将文件内容作为标准输入重定向给程序。
**思考:**如何一次性将多行内容写入到文件中?
# 方法1:使用引号
[laoma@centos7 ~]$ echo 'hello world
> hello python
> hello linux' > multi_lines.txt
[laoma@centos7 ~]$ cat multi_lines.txt
hello world
hello python
hello linux
# 方法2:使用cat重定向
[laoma@centos7 ~]$ cat > multi_lines.txt << EOF
> hello world
> hello python
> hello linux
> EOF
[laoma@centos7 ~]$ cat multi_lines.txt
hello world
hello python
hello linux
Shell基础
变量定义和查看
变量用于保存字符串值,便于后续引用,变量值存储在当前会话内存中。
变量名只能包含:
-
字母
-
数字
-
下划线
注意: 变量名不能以数字开头。
shell中变量的类型,一般不需要明确指明。
# 变量定义
[laoma@@centos7 ~]$ var1=key1
# 标准格式如下
[laoma@@centos7 ~]$ declare var1=key1
# 使用$引用变量值
[laoma@@centos7 ~]$ echo $var1
key1
# 示例2
[laoma@@centos7 ~]$ first_name=facai
[laoma@@centos7 ~]$ last_name=zhang
[laoma@@centos7 ~]$ echo $last_name $first_name
zhang facai
# 使用多个空格,效果一样
[laoma@@centos7 ~]$ echo $last_name $first_name
zhang facai
# 使用引号保留多个空格
[laoma@@centos7 ~]$ echo "$first_name $last_name"
zhang facai
[laoma@@centos7 ~]$ echo $last_name-$first_name
zhang-facai
[laoma@@centos7 ~]$ echo $last_name_$first_name
facai
# 使用{}限定变量范围
[laoma@@centos7 ~]$ echo ${last_name}_$first_name
zhang_facai
# 当前shell中有多少个变量
[laoma@@centos7 ~]$ set
# set命令还会显示函数
[laoma@@centos7 ~]$ set | grep first_name
first_name=facai
# 取消变量定义
[laoma@@centos7 ~]$ unset first_name
[laoma@@centos7 ~]$ echo $first_name
# 定义变量时候,转换变量大小写
[laoma@@centos7 ~]$ declare -l name=James
[laoma@@centos7 ~]$ echo $name
james
[laoma@@centos7 ~]$ declare -u name=James
[laoma@@centos7 ~]$ echo $name
JAMES
变量范围
-
局部变量,只在当前shell中生效。
-
全局变量,在当前shell以及shell子程序都生效。
[laoma@@centos7 ~]$ username=tom
[laoma@@centos7 ~]$ echo $username
tom
[laoma@@centos7 ~]$ bash
[laoma@@centos7 ~]$ echo $username
[laoma@@centos7 ~]$ export username=tom
# 或者
[laoma@@centos7 ~]$ username=tom;export username
[laoma@@centos7 ~]$ echo $username
[laoma@@centos7 ~]$ bash
[laoma@@centos7 ~]$ echo $username
tom
环境变量
根据变量是否是用户定义:
-
shell 环境内置变量:设置shell的运行环境。
-
用户自定义变量:字面意思,用户自己定义的变量,也就是普通变量。
部分shell环境变量如下:

LANG
[root@@centos7 ~]# date
2022年 11月 07日 星期一 13:38:31 CST
[root@@centos7 ~]# export LANG=en_US.utf8
[root@@centos7 ~]# date
Mon Nov 7 13:38:55 CST 2022
[root@@centos7 ~]# export LANG=zh_CN.utf8
[root@@centos7 ~]# date
2022年 11月 07日 星期一 13:40:49 CST
PATH
[root@@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@@centos7 ~]# mv /usr/bin/ls .
[root@@centos7 ~]# ls
bash: ls: command not found...
Similar command is: 'lz'
[root@@centos7 ~]# which ls
alias ls='ls --color=auto'
Similar command is: 'lz'
# 设置为原来的值
[root@@centos7 ~]#
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 将/root目录追加到PATH中
[root@@centos7 ~]# export PATH=$PATH:/root
[root@@centos7 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg ls
[root@@centos7 ~]# which ls
alias ls='ls --color=auto'
/root/ls
# ls移动到原来为止
[root@@centos7 ~]# mv ./ls /usr/bin
PS1
[laoma@@centos7 ~]$ echo $PS1
[\u@\h \W]\$
man bash 搜索PROMPTING
# 扩展说明:
\h 主机名,第一个 `.' 之前的部分
\H 主机名
\n 新行符
\t 当前时间,采用 24小时制的 HH:MM:SS 格式
\T 当前时间,采用 12小时制的 HH:MM:SS 格式
\@ 当前时间,采用 12小时制上午/下午 (am/pm) 格式
\A 当前时间,采用 24小时制上午/下午格式
\u 当前用户的用户名 the username of the current user
\w 当前工作目录
\W 当前工作目录的基本部分
\$ 如果有效 UID 是 0,就是 #, 其他情况下是 $
# 提示符变为了'HELLO '
[laoma@@centos7 ~]$ PS1='HELLO '
HELLO echo hello world
hello world
# 提示符带时间
[laoma@@centos7 ~]$ PS1='[\u@\h \W \t]\$ '
[laoma@@centos7 ~ 13:52:08]$
# 显示完整工作目录
[laoma@@centos7 ~ 13:52:08]$ PS1='[\u@\h \w \t]\$ '
[laoma@@centos7 ~ 13:52:56]$ cd /usr/share/doc
[laoma@@centos7 /usr/share/doc 13:53:04]$
彩色提示符
# 代码:
# \[\e[0;30m\]:黑色
# \[\e[0;31m\]:红色
# \[\e[0;32m\]:绿色
# \[\e[0;33m\]:黄色
# \[\e[0;34m\]:蓝色
# \[\e[0;35m\]:紫色
# \[\e[0;36m\]:青色
# \[\e[0;37m\]:白色
# \[\e[0m\]:恢复默认颜色
示例:
# vim /etc/bashrc 文件末尾添加一行
PS1='[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]@\[\e[0m\]\[\e[92;1m\]\h\[\e[0m\]\
[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\$\[\e[0m\] '
# 或者 echo 追加
echo "PS1='[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]@\[\e[0m\]\[\e[92;1m\]\h\
[\e[0m\]\[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\\\$\
[\e[0m\] '" >> /etc/bashrc
# 注意 echo追加的PS1与直接vim的是不一致的,体现在\\\$。
HISTTIMEFORMAT
控制历史命令时间格式。通过设置该变量,可以在执行 history 命令时显示每条历史命令的执行时间。
常用配置示例
- 显示年月日时分秒(如 2024-10-24 15:30:45 ):
export HISTTIMEFORMAT="%F %T "
效果: history 输出会类似 1000 2024-10-24 15:30:45 ls -l
- 显示更简洁的时间格式(如 10-24 15:30 ):
export HISTTIMEFORMAT="%m-%d %H:%M "
HISTTIMEFORMAT 支持的常见时间格式符:
-
%F :完整日期(年 - 月 - 日,如 2024-10-24 )
-
%T :完整时间(时:分: 秒,如 15:30:45 )
-
%Y :四位年份(如 2024 )
-
%m :两位月份(01-12)
-
%d :两位日期(01-31)
-
%H :24 小时制小时(00-23)
-
%M :分钟(00-59)
注意 echo追加的PS1与直接vim的是不一致的,体现在\$。
**HISTTIMEFORMAT**
控制历史命令时间格式。通过设置该变量,可以在执行 history 命令时显示每条历史命令的执行时间。
常用配置示例
1. **显示年月日时分秒**(如 2024-10-24 15:30:45 ):
```bash
export HISTTIMEFORMAT="%F %T "
效果: history 输出会类似 1000 2024-10-24 15:30:45 ls -l
- 显示更简洁的时间格式(如 10-24 15:30 ):
export HISTTIMEFORMAT="%m-%d %H:%M "
HISTTIMEFORMAT 支持的常见时间格式符:
-
%F :完整日期(年 - 月 - 日,如 2024-10-24 )
-
%T :完整时间(时:分: 秒,如 15:30:45 )
-
%Y :四位年份(如 2024 )
-
%m :两位月份(01-12)
-
%d :两位日期(01-31)
-
%H :24 小时制小时(00-23)
-
%M :分钟(00-59)
-
%S :秒(00-59)
更多推荐



所有评论(0)