vim
安装vim工具
[root@centos7 ~]# yum install vim
vim快捷键
-
定位文件内容:
-
w往后移
-
b往前移
-
e向后移一个单词
-
{上一个自然段
-
}下一个自然段
-
gg篇首
-
G篇尾
-
$行尾
-
^/0行首
-
-
插入:
-
A行末追加
-
o向下插入一行
-
O向上插入一行
-
i当前位置插入
-
I行首插入
-
-
复制:
-
复制几行
-
行数+y
-
复制单词
-
单词数+y+w+/b
-
p粘贴
-
-
删除:
-
x往后删
-
X往前删
-
dw删除一个字母,d2w删除两个,d5w删除5个......
-
-
回退
-
u回退上一个操作
-
U回退整行修改
-
-
修改
-
s删除单个字母后进入编辑模式
-
S删除整行后进入编辑模式
-
c删除一个字母,并且进入编辑模式
-
C从当前删除到最后,并进入编辑模式
-
vim配置
两个位置:
-
全局:/etc/vimrc,给所有用户设置一些默认值
-
用户:~/.vimrc,用户的个性化配置
常见的设置命令:
[root@centos7 ~]# cat ~/.vimrc # 显示行号 set number # 显示操作命令 set showcmd # ai,自动缩进;ts,tabspace使用2个空格代替 set ai ts=2 # 列高亮对齐显示 set cursorcolumn # 行高亮对齐显示 set cursorline
输入输出重定向
标准输出重定向到文件
基本用法
命令 | 含义 | 作用 |
---|---|---|
> 文件 | 输出重定向(覆盖) | 将命令输出覆盖写入文件中 |
>> 文件名 | 输出重定向(追加) | 将命令输出追加写入文件末尾 |
直接创建空文件
功能:创建一个空文件,如果文件存在就清空它的内容。
> 文件名 举例: [yuxb@centos7 ~]$ > testfile [yuxb@centos7 ~]$ >> testfile
形象比喻
命令 | 比喻说明 |
---|---|
> | 把一张写满内容的纸撕掉,换一张新纸再写(或先空着) |
> | 在原来的纸后面继续写,不破坏原来的内容 |
> 文件 | “我今天不写信,只是清空信纸,为明天准备。” |
>> 文件名 | “前面写了一段,今天继续往后写。” |
示例操作
echo "第一行" > file.txt
-
输出:"第一行"
-
效果:创建或清空 file.txt,写入“第一行”
echo "第二行" >> file.txt
-
输出:"第二行"
-
效果:追加“第二行”到 file.txt的末尾,不影响“第一行”
具体实操
# 查找 /etc 目录下 文件名是passwd的所有文件 [yuxb@centos7 ~]$ find /etc/ -name passwd find: ‘/etc/grub.d’: 权限不够 find: ‘/etc/pki/CA/private’: 权限不够 find: ‘/etc/pki/rsyslog’: 权限不够 /etc/pam.d/passwd find: ‘/etc/dhcp’: 权限不够 /etc/passwd find: ‘/etc/selinux/targeted/active’: 权限不够 find: ‘/etc/selinux/final’: 权限不够 find: ‘/etc/lvm/archive’: 权限不够 find: ‘/etc/lvm/backup’: 权限不够 find: ‘/etc/lvm/cache’: 权限不够 ....... # 将找到的文件名清单覆盖写入到passwd.list文件中 [yuxb@centos7 ~]$ find /etc/ -name passwd > passwd.list find: ‘/etc/grub.d’: 权限不够 find: ‘/etc/pki/CA/private’: 权限不够 find: ‘/etc/pki/rsyslog’: 权限不够 find: ‘/etc/dhcp’: 权限不够 find: ‘/etc/selinux/targeted/active’: 权限不够 ...... [yuxb@centos7 ~]$ cat passwd.list /etc/pam.d/passwd /etc/passwd # 1和>之间不能有空格 [yuxb@centos7 ~]$ find /etc -name 'passwd' 1>passwd.list find: ‘/etc/grub.d’: 权限不够 find: ‘/etc/pki/CA/private’: 权限不够 find: ‘/etc/pki/rsyslog’: 权限不够 find: ‘/etc/dhcp’: 权限不够 ...... [yuxb@centos7 ~]$ cat passwd.list /etc/pam.d/passwd /etc/passwd # 将多个文件内容合并为1个 [yuxb@centos7 ~]$ cat /etc/fstab /etc/hosts > allinone # 将找到的文件名清单追加写入到passwd.list文件中 [yuxb@centos7 ~]$ find /etc -name 'passwd' 1>>passwd.list find: ‘/etc/grub.d’: 权限不够 find: ‘/etc/pki/CA/private’: 权限不够 find: ‘/etc/pki/rsyslog’: 权限不够 find: ‘/etc/dhcp’: 权限不够 find: ‘/etc/selinux/targeted/active’: 权限不够 ...... [yuxb@centos7 ~]$ cat passwd.list /etc/pam.d/passwd /etc/passwd /etc/pam.d/passwd /etc/passwd # 将错误信息覆盖写入到passwd.err文件中 [yuxb@centos7 ~]$ find /etc -name 'passwd' 2>passwd.err /etc/pam.d/passwd /etc/passwd [yuxb@centos7 ~]$ cat passwd.err find: ‘/etc/grub.d’: 权限不够 find: ‘/etc/pki/CA/private’: 权限不够 find: ‘/etc/pki/rsyslog’: 权限不够 find: ‘/etc/dhcp’: 权限不够 ...... # 将错误信息扔掉 [yuxb@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null /etc/pam.d/passwd /etc/passwd # 将错误信息追加写入到passwd.err文件中 [yuxb@centos7 ~]$ find /etc -name 'passwd' 2>>passwd.err /etc/pam.d/passwd /etc/passwd [yuxb@centos7 ~]$ cat passwd.err find: ‘/etc/grub.d’: 权限不够 find: ‘/etc/pki/CA/private’: 权限不够 find: ‘/etc/pki/rsyslog’: 权限不够 find: ‘/etc/dhcp’: 权限不够 find: ‘/etc/selinux/targeted/active’: 权限不够 ......
标准输出重定向到程序
管道符|
什么是管道符 |
管道符 | 的作用是:
将前一个命令的“输出”作为后一个命令的“输入”。
示例
# 查看哪个man page 可以resize ext4文件系统大小 # 搜索所有ext4手册,并报错到ext4.man文件中 [yuxb@centos7 ~]$ man -k ext4 > ext4.man # 过滤ext4.man文件中含有resize的行 [yuxb@centos7 ~]$ grep resizer ext4.man resize2fs (8) - ext2/ext3/ext4 file system resizer # 以上两个命令和合并为一行 [yuxb@centos7 ~]$ man -k ext4 | grep resizer resize2fs (8) - ext2/ext3/ext4 file system resizer
总结
命令1 | 命令2 | 命令3 ... 输出 → 输入 → 再输出 → 再输入 ...
tee 命令
tee命令的作用
tee 命令接收来自标准输入(stdin)的数据,同时:
-
把内容输出到标准输出(屏幕)
-
也保存到指定文件中
示例
[yuxb@centos7 ~]$ > passwd.list [yuxb@centos7 ~]$ cat passwd.list # tee命令覆盖保存到文件 [yuxb@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null | tee passwd.list /etc/pam.d/passwd /etc/passwd [yuxb@centos7 ~]$ cat passwd.list /etc/pam.d/passwd /etc/passwd # tee命令追加保存到文件 [yuxb@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null |tee -a passwd.list /etc/pam.d/passwd /etc/passwd [yuxb@centos7 ~]$ cat passwd.list /etc/pam.d/passwd /etc/passwd /etc/pam.d/passwd /etc/passwd # tee的标准输出继续通过管道传递下去 [yuxb@centos7 ~]$ man -k passwd | tee passwd.man | grep passwd
标准输入重定向给程序
cat命令
基本用法
命令 | 说明 |
---|---|
cat 文件名 | 显示文件内容 |
cat file1 file2 > newfile | 合并多个文件并写入新文件 |
cat > 文件 | 从键盘输入内容并保存到文件 |
cat >> 文件名 | 追加输入内容到已有文件 |
cat < 文件 | 将文件作为标准输入提供给 cat |
cat << EOF......EOF | 省略号中间输入内容 |
示例1
# 查看 [yuxb@centos7 ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # cat命令标准输入数据 [yuxb@centos7 ~]$ cat < /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # ctrl+d 输入完成,退出 [yuxb@centos7 ~]$ cat hello # 键盘输入hello后回车 hello # 屏幕上显示hello world world # shell读取到EOF时候,代表标准输入完成 [yuxb@centos7 ~]$ cat <<EOF > hello > world > EOF hello world # EOF 可以换成任意的字母或数字,只需要前后结尾一致就可以 [yuxb@centos7 ~]$ cat <<666 > dfgb > df > 666 dfgb df
示例2
如何一次性将多行内容写入到文件中?
# 方法1:使用引号 [yuxb@centos7 ~]$ echo 'hello world > hello python > hello linux' > multi_lines.txt [yuxb@centos7 ~]$ cat multi_lines.txt hello world hello python hello linux # 方法2:使用cat重定向 [yuxb@centos7 ~]$ cat > multi_lines.txt << EOF > hello world > hello python > hello linux > EOF [yuxb@centos7 ~]$ cat multi_lines.txt hello world hello python hello linux
Shell variable
变量和常量
定义
变量:可以变的量,程序运行过程中它的值可以修改
常量:不可变的量,程序运行过程中它的值不可以修改
示例
# 变量定义 [yuxb@centos7 ~]$ var1=key1 # 标准格式如下 [yuxb@centos7 ~]$ declare var1=key1 # 使用$引用变量值 [yuxb@centos7 ~]$ echo $var1 key1 [yuxb@centos7 ~]$ username=zhangsan [yuxb@centos7 ~]$ echo $username zhangsan [yuxb@centos7 ~]$ age=18 [yuxb@centos7 ~]$ echo $age 18 [yuxb@centos7 ~]$ first_name=san [yuxb@centos7 ~]$ last_name=zhang [yuxb@centos7 ~]$ echo $last_name $first_name zhang san # 使用多个空格,效果一样 [yuxb@centos7 ~]$ echo $last_name $first_name zhang san [yuxb@centos7 ~]$ echo "$first_name $last_name" san zhang [yuxb@centos7 ~]$ echo "$last_name $first_name" zhang san [yuxb@centos7 ~]$ echo $last_name-$first_name zhang-san [yuxb@centos7 ~]$ echo $last_name_$first_name san # 使用{}限定变量范围 [yuxb@centos7 ~]$ echo ${last_name}_$first_name zhang_san # 当前shell中有多少个变量 [yuxb@centos7 ~]$ set ABRT_DEBUG_LOG=/dev/null BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath ...... # set命令还会显示函数 [yuxb@centos7 ~]$ set | grep first_name first_name=san [yuxb@centos7 ~]$ set | grep last_name last_name=zhang # 取消变量定义 [yuxb@centos7 ~]$ unset first_name [yuxb@centos7 ~]$ echo $first_name # 定义变量时候,转换变量大小写 [yuxb@centos7 ~]$ declare -l name=Tom [yuxb@centos7 ~]$ echo $name tom [yuxb@centos7 ~]$ declare -u name=tom [yuxb@centos7 ~]$ echo $name TOM
环境变量
什么是环境变量
环境变量是 Linux 系统中用于配置运行环境的一些变量,比如:
-
PATH:命令搜索路径
-
HOME:当前用户的主目录
-
USER:当前登录用户
-
SHELL:默认使用的 Shell 程序
# EDITOR [root@centos7 ~]# visudo # 以上命令默认使用vi 编辑文件/etc/sudoers [root@centos7 ~]# export EDITOR=/bin/vim [root@centos7 ~]# visudo # 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 # PATH [root@centos7 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
命令替换
格式如下:
-
$(COMMAND)
-
`COMMAND`
[yuxb@centos7 ~ 15:52:34]$ date +%F 2025-07-22 [yuxb@centos7 ~ 15:57:21]$ date +%F%m%d 2025-07-220722 [yuxb@centos7 ~ 15:57:36]$ date +%Y%m%d 20250722 [yuxb@centos7 ~ 15:57:47]$ touch file-$(date +%Y%m%d).txt [yuxb@centos7 ~ 15:59:14]$ ls file-20250722.txt 公共 模板 视频 图片 文档 下载 音乐 桌面
保留字符字面含义
许多字符在bash中有特殊的意义,忽略这些含义,使用引号和转义字符。
-
\,取消后面单个字符的特殊含义。
-
双引号(""),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符。
-
单引号(''),可以压缩单引号内部的所有字符含义。
# \ 示例 [yuxb@centos7 ~ 16:09:09]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yuxb/.local/bin:/home/yuxb/bin [yuxb@centos7 ~ 16:10:16]$ echo \$PATH $PATH # "" 示例 [yuxb@centos7 ~ 16:10:22]$ echo "****** welcome $USER to our classroom ******" ****** welcome yuxb to our classroom ****** [yuxb@centos7 ~ 16:10:30]$ echo "****** welcome $USER to our classroom on (date +%F) ******" ****** welcome yuxb to our classroom on (date +%F) ****** [yuxb@centos7 ~ 16:11:40]$ echo "****** welcome $USER to our classroom on $(date +%F) ******" # '' 示例 ****** welcome yuxb to our classroom on 2025-07-22 ****** [yuxb@centos7 ~ 16:11:56]$ echo '****** welcome $USER to our classroom on $(date +%F)******' ****** welcome $USER to our classroom on $(date +%F)******
拓展
[yuxb@centos7 ~ 16:22:44]$ echo 'Let\'s go' > ' Let\s go [yuxb@centos7 ~ 16:23:26]$ echo "Let\'s go" Let\'s go [yuxb@centos7 ~ 16:23:48]$ echo "Let's go" Let's go [yuxb@centos7 ~ 16:23:54]$ echo "Let's go!" -bash: !": event not found [yuxb@centos7 ~ 16:24:07]$ echo "Let's go! " Let's go! [yuxb@centos7 ~ 16:24:11]$ echo Let\'s go Let's go [yuxb@centos7 ~ 16:24:52]$ echo "set number > set ai > set ts=2" >vimrc [yuxb@centos7 ~ 16:26:19]$ cat vimrc set number set ai set ts=2 [yuxb@centos7 ~ 16:26:22]$ echo "hello 1 > hello 2 > hello 3" >hello.txt [yuxb@centos7 ~ 16:26:51]$ cat hello.txt hello 1 hello 2 hello 3