shell与shell script

Sl0th Lv4

vim程序编辑器

基本概念

vim与vi

vim是vi的高级版本,vim有语法高亮等

vi/vim的使用

编辑模式

打开即是默认模式(一般模式),输入i/o/r/a任意一个字母会进入编辑模式,不限制大小写,i/o/a是插入,r是替换

替换模式:直接键入字符,替换光标所在字符

在vi里,tab键得到结果和空格符得到的结果不一样

命令行模式

一般模式中,输入: / ?3个中的一个就可以进入命令行模式

返回一般模式

Esc + :wq

强制写入:wq! 前提是可以改权限

  • w 写入 (也可以w[filename]表示为另存为)
  • q 离开
  • ZZ 没改动就不保存离开,改动就保存后离开

移动光标

在一般模式下,除长按外,可以先写次数再按键(30->为光标向右移动30个字符)

直接输,输入不会回显在屏幕上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Ctrl] + [f] 屏幕“向下”移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕“向上”移动一页,相当于 [Page Up] 按键(常用)
[Ctrl] + [d] 屏幕“向下”移动半页
[Ctrl] + [u] 屏幕“向上”移动半页
+ 光标移动到非空白字符的下一行
- 光标移动到非空白字符的上一行
n + 空格键 光标会向右移动这一行的 n 个字符
0 或功能键[Home] 移动到这一行的最前面字符处(常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个文件的最后一行(常用)
nG 移动到这个文件的第 n 行
gg 移动到这个文件的第一行,相当于 1G
n<Enter> 光标向下移动 n 行

块选择–visual block模式

在一般模式中按下v或V进入

此时光标经过位置会被选中,可以进行以下具体操作

1
2
3
y 将选中的地方复制起来
d 将选中的地方删除
p 将刚刚y的内容粘贴

复制的内容只在当前vim窗口生效,没有进入电脑剪切板

多文件编辑

:n 编辑下一个文件

:N 编辑上一个文件

:files 列出目前这个vim的打开的所有文件

vim后面可以跟多个文件名,如果有文件内容相同的文件,只会读取第一个,后面重复的会直接跳过

多窗口

:sp[filename]

filename可有可无,如果想在新窗口启动另一个文件,就加filename,否则默认在使当前文件出现在两个窗口

ctrl+w+j 移到下面的窗口

ctrl+w+k 移到上面的窗口

ctrl+w+q 退出

vim环境设置

~/.viminfo

主动记录操作

~/.vimrc 环境设置参数

set nu
set nonu

设置行号

set hlsearch
set noglsear

hlsearch(=high light search 高亮度查找),设置是否将查找的字符串 反白的设置值

set autoindent
set noautoindent

表示是否自动缩排

set backup
set nobackup

表示自动保存备份文件,一般设置为 nobackup ,如果设置为backup的话,当你改动任何一个文件时,原文件会被保存成一个文件名为 filename~ 的文件。

set ruler

设置右下角的状态栏说明

set showmode

显示 insert 之类的字

set backspace=(0 1 2)

设置 2 表示进入编辑模式后可以删除任意字符, 设置 0 或 1 表示进入编辑模式后只能删除刚才输入的字符,不能删除原本就存在的字符了

set all

显示目前所有的环境参数设置值

set

显示与系统默认值不同的设置参数,就是用户自己变动过的设置参数

syntax on
syntax off

是否根据程序相关语法显示不同颜色。

set bg=dark
set bg=light

显示不同的底色色调

image-20220918163650086
image-20220918163650086

注意事项

中文编码

一般都为utf8,但若vim打开big5编码,会有乱码,此时可以设置LANG属性

1
➜  test LANG=zh_CN.big5

语系编码转换

1
2
3
4
5
6
iconv [options]
iconv -f 原编码 -t 新编码 filename [-o newfile]
--list 列出支持的语系数据
-f 后接原来的编码格式
-t 后接后来的🆕编码格式
-o file 如果要保留原本的文件,那么使用-o 新文件名,可以建立新编码文件

bash

基本功能

命令记忆能力 history

可以查看之前用过的命令

命令与文件补全功能(Tab键)

c[Tab][Tab] 回显所有c开头命令

一串命令的第一个字后加Tab则为命令补全

第二个字后加Tab为文件补齐

命令设置别名 alias

alias lm='ls -al' 相当于给ls -al命令加了个缩写标识符,输入lm则会执行该命令

控制

ctrl+c 中断进程

shell script

可以批量处理文件

通配符

type命令

1
2
3
4
5
type [-tpa] name
不加任何options时,会回显name是内置命令还是外置命令
-t 回显为 file/alias/builtion 分别表示外部命令、别名、内置命令
-p name为外部命令时回显完整文件名
-a 从PATH变量定义的路径中,将含name的命令都列出来,包含alias

命令执行

可支持多行执行,这也有利于ctf题目中的绕过waf

主要利用反斜杠\,原理为将功能为命令执行的回车符转义了,使得命令可以在下一行继续输入(终端中会以>开头提示输入)

1
2
➜  test cp 1 2 \
> test1

shell变量

一般大写的是系统默认变量(PATH、SHELL、HOME等),小写是命令

如果要echo内置变量,要在变量名前加$

变量的显示与设置

  • 打印 echo $变量名 / echo ${变量名}

  • 设置

    • 变量名=值
  • 设置规则

    • 等号两边不能有空格,赋值及变量名中也不能有空格(如果值被双引号或单引号包裹时可以有空格符)
    • 单双引号包裹内容区别:双引号包裹的$字符可以解析变量,因此可以插入变量,单引号就是纯文本
    • 可以用转义字符转义特殊字符
    • 变量名只能是数字字母,不能数字开头
    • 变量赋值双引号中可以插入命令$(命令),将命令执行的结果插入赋值中
    • 当要在子进程中使用该变量时,export 变量名使其变成环境变量
      • 但是重启当前父shell窗口后又会被清空,若要永久使用,要在配置文件中加export或alias语句(zsh配置文件为~/.zshrc~/.zprofile),设置为记得source一下配置文件
  • 取消变量 unset 变量名

exit 离开当前子进程

在当前shell下,另开一个shell就相当于子进程,父进程的自定义变量无法在子进程中使用,但是export变成环境变量后就可以在子进程中使用

环境变量功能

env 查看当前shell环境变量,即export的变量,alias不包括其中

常见环境变量

1
2
3
4
5
6
7
8
9
10
HOME  ~的路径
SHELL 当前shell程序
HISTSIZ 最多纪录的历史命令条数
MAIL 使用mail命令时读取的邮箱文件
PATH 执行文件查找的路径,目录与目录间以 : 分隔,若已安装的外部命令的可执行文件没有被加入 PATH中,会回显`zsh: command not found: aaaa`,同时若有同名命令,按PATH中的顺序 使用第一个
LANG 语系数据
RANDOM 随机数,在bash中时0~32767,若要生成0~9,使用declare
`declare -i number=$RANDOM%10;echo $number`
也可以
`declare -i number=$RANDOM*10/32768;echo $number`

set命令可以查看所有变量(环境变量与自定义变量)

变量的测试与替换

语法:new_var=${old_var-content} :一般new_var与old_var都写成同一个变量,这样相当于测试变量是否存在

username=${username-root} :如果变量没有设置(即没有这个变量),就赋值root,如果设置就不改

如果变量是空字符串,那直接echo和echo一个不存在变量的内容是一样的,因此直接echo不能判断变量是不是存在

如果一定要给空字符串设置

1
new_var=${old_var:-content}

:后,变量为空或是未设置都能被替换

设置别名

alias

unalias

通配符与特殊符号

image-20220919190354111
image-20220919190354111

配置

配置文件

image-20220919185418826
image-20220919185418826

读取

source 配置文件名

环境设置

stty [-a] 列出所有按键和其对应内容

stty erase [按键内容] 设置删除字符键的快捷键

image-20220919185933635
image-20220919185933635

数据流重定向

>

命令 > 文件 :将命令输出结果输入到文件(但是会覆盖)

>>

命令 >> 文件 :将命令输出结果追加到文件末尾

>>>都会在文件不存在时自动创建

输出与错误输出

  • 1> 以覆盖到方法将正确的数据输出到指定的文件或设备上
  • 1>> 以累加的方法将正确的数据输出到指定的文件或设备上
  • 2> 以覆盖到方法将错误的数据输出到指定的文件或设备上
  • 2>> 以累加到方法将错误的数据输出到指定的文件或设备上

错误的数据输出就相当于报错信息

e.g.将错误信息丢弃

1
find /home -name .bashrc 2> /dev/null

/dev/null垃圾桶黑道,可以吃掉任何传入信息

e.g.将错误和正确信息都写到同一个文件中

1
2
3
find /home -name test > list 2>&1

find /home -name test &> list

<

接收文件 < 输入文件 :用输入文件的内容来代替键盘输入

<<

结束输入

1
2
3
4
5
➜  desktop cat > catfile << "eof"
heredoc> as
heredoc> dsdsds
heredoc> sdsdsd
heredoc> eof

<<后跟结束输入关键字,这样就不用ctrl+d来结束

单纯的输入cat > catfile来编写catfile需要ctrl+d来结束

管道命令

连接符

  • ; 连续命令执行,cmd;cmd
  • cmd1 && cmd2 1成功执行且为正确才执行2,否则2不执行
  • cmd1 || cmd2 1成功执行且正确,2不执行,否则执行2

管道符

cmd1 | cmd2 cmd1的输出作为cmd2的输入,管道符会忽略报错输出

选取命令

  • cut 选取信息中的部分
    • cut -d ‘分隔字符’ -f 输出行数(多行的话逗号连接)
    • cut -c 字符范围
      • cut -c 12- 取得第12字符以后的内容
  • grep :查找单位为行
    • 可搭配管道符 cmd | grep '查找字符串' 将cmd输出结果中含查找字符的都显示出来
      • -a 将二进制文件以text文件方式查找数据
      • -c 计算找到查找字符串的次数
      • -i 大小写不敏感
      • -n 输出时加上行号
      • -v 反向选择,找不含查找字符串的行
      • –color=auto 找到的关键字部分加上颜色

排序命令

sort

uniq 重复数据只出现一个

wc 统计文件字符数行数,-l 列出行数 -w 列出字数(英文单字) -m 字符数

双向重定向

tee 同时将数据流传给文件与屏幕

1
tee [-a] file

e.g. 将执行结果转存一份,同时屏幕上也可以看到

last | tee last.list | cut -d " " -f 1

字符转换命令

tr 删除或替换

col 常用于将man page转存为纯文本文件方便查询

join 合并两个文件(可选操作多)

paste 直接拼接两个文件,[tab]隔开

expand 将tab转空格

  • 标题: shell与shell script
  • 作者: Sl0th
  • 创建于 : 2021-12-03 23:33:31
  • 更新于 : 2024-11-11 18:23:06
  • 链接: http://sl0th.top/2021/12/03/shell与shell-script/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论