vim 变量 shell
vim 文本编辑器 模式编辑器
行编辑器 sed awk
vim 主要三种模式: 命令模式:移动光标;剪切文本;改变模式
插入模式:修改文本(i 在光标处开始插入模式 I 在行
首插入 A 在行尾后补 a 在光标后补充内容 o 插入一个
新行在下面 O 插入一个新行在上面 c -change c+e c+$
)
末行模式:保存、退出等等
vim +n 文本 文本光标处于第几行
保存退出 :wq :x ZZ
不保存退出: :q :q!
:w path路径 当编辑文件路径有问题或更改时使用
命令模式:
按字符移动 arrow h j k l
按单词移动 w e b [o ^ $]
按句移动 )(
按段移动 }{
跳转第几行 xG (1G G)
翻屏操作: ctrl+f/b/u/d
cc 删除此行并转换到插入模式
删除操作 d
x(删除单个字符)Nx X 删除光标之前字符
复制 y (w $) 粘贴 p P 替换 r
移动字符 先dd在p 撤消操作 u U
重做 . 撤销撤销 ctrl+ r
可视化模式 v/V
扩展:末行模式
:n 跳转n行 10,100 y +p 复制第十行到第100行的文本
%y 全文复制 (1,$ y)
打开多个文件 vim file1 file2
:next(下一个) prev(前一个) first last
:set nu nonu 显示行
:set ai 自动缩进
:syntax on/off 语法高亮显示
配置文件: /etc/vimrc
-/.vimrc 用户家目录自己vim 配置文件
查找 /keyword ?keyword n/N
替换:末行模式
:s :address ,address s ///
:1,10 s /abc/ABC/
globbing 命令行扩展
1.~ 2. {}扩展展开 3 `反引号 $()
变量 :命名的存储空间
bashshell :1.不区分变量类型
2.不需要事先声明
声明变量 VARNAME =
引用 echo $VARNAME
命名规则 : 1只能以字母下划线开头 2 只包含字母、数字和下划线 3 建议变
量名大写
变量类型:1 本地变量 2 环境变量 (export printenv)3 特殊变量:bash内
置变量 4 位置变量
某些通用变量
PS1:bash 提示符的外观 默认状态[\u@\h \W]!$
PATH :在其中查找可执行文件的目录
EDITOR:默认文本编辑器
HISTSIZE:bash 命令历史的命令数量 ~/.bash_history
补充:which + command 可执行文件路径
hash 已使用命令的执行路径历史
别名(alias)
alias dir='ls -laf'
取消别名 unalias dir
取反义 /dir
变量引用 ""弱引用 ''强引用
命令替换 $()和``
登陆shell和非登陆shell的启动配置不同
登陆shell是:任何在登陆是创建的shell;su -
非登录shell是: su;图形化终端;执行的脚本;任何其他shell实例
bash启动脚本
启动脚本是bash启动时自动执行的脚本。用户可以把一些环境变量的设置和alias
、umask设置放在启动脚本中,这样每次启动Shell时这些设置都自动生效。思考
一下,bash在执行启动脚本时是以fork子Shell方式执行的还是以source方式执行
的?
启动bash的方法不同,执行启动脚本的步骤也不相同,具体可分为以下几种情况
。
1. 作为交互登录Shell启动,或者使用--login参数启动 请点评
交互Shell是指用户在提示符下输命令的Shell而非执行脚本的Shell,登录Shell
就是在输入用户名和密码登录后得到的Shell,比如从字符终端登录或者用
telnet/ssh从远程登录,但是从图形界面的窗口管理器登录之后会显示桌面而不
会产生登录Shell(也不会执行启动脚本),在图形界面下打开终端窗口得到的
Shell也不是登录Shell。
这样启动bash会自动执行以下脚本:
首先执行/etc/profile,系统中每个用户登录时都要执行这个脚本,如果系统管
理员希望某个设置对所有用户都生效,可以写在这个脚本里
然后依次查找当前用户主目录的~/.bash_profile、~/.bash_login和~/.profile
三个文件,找到第一个存在并且可读的文件来执行,如果希望某个设置只对当前
用户生效,可以写在这个脚本里,由于这个脚本在/etc/profile之后执
行,/etc/profile设置的一些环境变量的值在这个脚本中可以修改,也就是说,
当前用户的设置可以覆盖(Override)系统中全局的设置。~/.profile这个启动
脚本是sh规定的,bash规定首先查找以~/.bash_开头的启动脚本,如果没有则执
行~/.profile,是为了和sh保持一致。
顺便一提,在退出登录时会执行~/.bash_logout脚本(如果它存在的话)。
2. 以交互非登录Shell启动 请点评
比如在图形界面下开一个终端窗口,或者在登录Shell提示符下再输入bash命令,
就得到一个交互非登录的Shell,这种Shell在启动时自动执行~/.bashrc脚本。
为了使登录Shell也能自动执行~/.bashrc,通常在~/.bash_profile中调用
~/.bashrc:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi这几行的意思是如果~/.bashrc文件存在则source它。多数Linux发行版在创建
帐户时会自动创建~/.bash_profile和~/.bashrc脚本,~/.bash_profile中通常都
有上面这几行。所以,如果要在启动脚本中做某些设置,使它在图形终端窗口和
字符终端的Shell中都起作用,最好就是在~/.bashrc中设置。
下面做一个实验,在~/.bashrc文件末尾添加一行(如果这个文件不存在就创建它
):
export PATH=$PATH:/home/akaedu然后关掉终端窗口重新打开,或者从字符终端
logout之后重新登录,现在主目录下的程序应该可以直接输程序名运行而不必输
入路径了,例如:
~$ a.out就可以了,而不必
~$ ./a.out为什么登录Shell和非登录Shell的启动脚本要区分开呢?最初的设计
是这样考虑的,如果从字符终端或者远程登录,那么登录Shell是该用户的所有其
它进程的父进程,也是其它子Shell的父进程,所以环境变量在登录Shell的启动
脚本里设置一次就可以自动带到其它非登录Shell里,而Shell的本地变量、函数
、alias等设置没有办法带到子Shell里,需要每次启动非登录Shell时设置一遍,
所以就需要有非登录Shell的启动脚本,所以一般来说在~/.bash_profile里设置
环境变量,在~/.bashrc里设置本地变量、函数、alias等。如果你的Linux带有图
形系统则不能这样设置,由于从图形界面的窗口管理器登录并不会产生登录Shell
,所以环境变量也应该在~/.bashrc里设置。
3. 非交互启动
为执行脚本而fork出来的子Shell是非交互Shell,启动时执行的脚本文件由环境
变量BASH_ENV定义,相当于自动执行以下命令:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi如果环境变量BASH_ENV的值不
是空字符串,则把它的值当作启动脚本的文件名,source这个脚本。
4. 以sh命令启动
如果以sh命令启动bash,bash将模拟sh的行为,以~/.bash_开头的那些启动脚本
就不认了。所以,如果作为交互登录Shell启动,或者使用--login参数启动,则
依次执行以下脚本:
/etc/profile
~/.profile
如果作为交互Shell启动,相当于自动执行以下命令:
if [ -n "$ENV" ]; then . "$ENV"; fi如果作为非交互Shell启动,则不执行任
何启动脚本。通常我们写的Shell脚本都以#! /bin/sh开头,都属于这种方式。