Linux基础笔记(二):Vim操作进阶、输入输出重定向与Shell变量管理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值