当前位置: 代码网 > it编程>前端脚本>Powershell > The Missing Semester ( Shell 工具和脚本 和 Vim)

The Missing Semester ( Shell 工具和脚本 和 Vim)

2024年08月01日 Powershell 我要评论
创建 .vimrc 文件并进行基本配置:set number " 显示行号syntax on " 语法高亮set tabstop=4 " 设置 tab 宽度为 4set expandtab " 用空格替代 tab。

quote  

quote  消除特殊字符对shell的特殊意义(禁用特殊字符的特殊处理(special treatment),防止保留字(reserved words)被识别为保留字,并防止参数扩展。

  • 转义字符:使用反斜杠 \ 进行引用

反斜杠\ 若直接跟着换行符,视为行继续符(line continuation, removed from the input stream and effectively ignored )

这意味着换行符将被忽略,下一行与当前行将被视为同一行命令的一部分 

this will work:

true   && \
echo b   # ^ no space here, newline character immediately after \
true   &&         
echo b # ^^^^^^^^^ zero or more spaces, they don't matter

but this won't work*:

true   && \ 
echo b   # ^ escaped space here, it breaks things

the escaped space is like a quoted space. this also won't work*:

true   && ' '
echo b   # ^ quoted space here, it breaks things
  • 单引号:所有字符都视为普通字符

  • 双引号:保留部分特殊字符的功能(如 $\)。

chmod

chmod :changes the file mode bits  

  • 文件权限位(file permission bits:控制文件的基本访问权限(如读、写、执行)。
  • 特殊模式位(special mode bits:提供额外的控制功能,仅对某些文件有效(如 setuidsetgidsticky 位)。

管道符号

(1)管道符号 | 将前一个命令的输出作为下一个命令的输入

例如: 

以下为 ./semester输出中提取包含 "last-modified" 的行并写入文件 last-modified.txt

./semester | grep "last-modified" > ~/last-modified.txt

ls命令

ls 命令用于列出目录内容。它有许多选项,可以控制输出的格式和信息的详细程度。以下是一些常用选项和它们的功能:

  • 基本用法ls [选项] [文件或目录]
常用选项:
  • -l:长格式列出文件详细信息,包括权限、链接数、所有者、组、大小和修改时间。
  • -a:显示所有文件,包括以 . 开头的隐藏文件。
  • -h:以人类可读的格式显示文件大小(例如,1k、234m、2g)。
  • -t:按文件的修改时间排序,最近修改的文件在最前面。
  • -r:反转排序顺序。
  • -r:递归地列出目录及其子目录中的所有文件。
  • --color[=when]:彩色显示输出,when 可以是 alwaysautonever
  • -s:按文件大小排序,最大的文件在最前面。

shell

1. shell 脚本基础操作
(1)变量赋值和引用
  • 注意:不要在变量赋值时使用空格 
    
    正确:    foo=bar
    
    错误:    foo = bar。
    
  • 引用变量时,需要在变量名前加上美元符号 $。这会告诉 bash 解释器去获取变量的值。
    
    $foo
特殊变量:
#!/bin/bash

# 特殊变量示例和说明

# 退出状态码 ($?)
# $? 表示上一个命令的退出状态码
echo "running 'ls /' command"
ls /
echo "退出状态码是: $?"

echo "running 'ls /nonexistent' command"
ls /nonexistent
echo "退出状态码是: $?"

echo

# 进程id ($$) 和 父进程id ($ppid)
# $$ 表示当前脚本的进程id
# $ppid 表示当前脚本的父进程id
echo "当前脚本的进程id是: $$"
echo "当前脚本的父进程id是: $ppid"

echo

# 脚本参数 ($0, $1, $2, ..., $#)
# $0 表示脚本名
# $1, $2, ... 表示脚本参数
# $# 表示脚本参数个数
# $@ 表示所有脚本参数(列表)
# $* 表示所有脚本参数(作为一个字符串)
echo "脚本名: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数个数: $#"
echo "所有参数 (列表): $@"
echo "所有参数 (字符串): $*"

echo

# 遍历所有参数
for arg in "$@"; do
    echo "参数: $arg"
done
注意:
while [ $? -eq 0 ]; do
        ./random_error.sh
        n=$((n + 1))

done  
(1) n=$((n + 1))也认为是一个命令,影响$?的取值
(2)字符串
单引号 ':不转义变量,例如 '$foo' 输出 $foo。

双引号 ":会转义变量,例如 "$foo" 输出 bar(假设 foo=bar)。
(3)控制流

 (1)数值比较符

-eq 等于 equal

-ne 不等于 not equal

-gt 大于 greater than

-ge 大于或等于 greater than or equal

-lt 小于 less than

-le 小于或等于 less than or equal

 (2)字符串比较操作符

[ -z "$a" ]  # 如果字符串 a 的长度为 0
[ -n "$a" ]  # 如果字符串 a 的长度非 0

 (3)文件比较操作符

[ -e "$file" ]  # 如果文件存在

[ -f "$file" ]  # 如果是一个普通文件

[ -d "$file" ]  # 如果是一个目录

[ -s "$file" ]  # 如果文件非空

[ -r "$file" ]  # 如果文件可读

[ -w "$file" ]  # 如果文件可写

[ -x "$file" ]  # 如果文件可执行

(4)条件判断 (if, else if, else)

  • if 语法: if [ condition ]; then ... fi
  • else if 语法: elif [ condition ]; then ... fi
  • else 语法: else ... fi
#!/bin/bash
read -p "输入文件路径: " filepath
if [ -e $filepath ]; then
    if [ -f $filepath ]; then
        echo "这是一个普通文件"
    elif [ -d $filepath ]; then
        echo "这是一个目录"
    else
        echo "这是其他类型的文件"
    fi
else
    echo "文件不存在"
fi

(5)循环 (for, while, until)

  • for 语法: for var in list; do ... done
  • while 语法: while [ condition ]; do ... done
  • until 语法: until [ condition ]; do ... done
#!/bin/bash
for i in {1..10}; do
    echo $i
done

#!/bin/bash
sum=0
i=0
while [ $i -lt 100 ];do
	i=$((i + 1))
	sum=$((sum + i))
done 
echo "结果为$sum"
(4)命令替换
$(cmd):执行命令 cmd 并用其输出替换。

echo "starting program at $(date)"
(5)通配(globbing)

示例:

*.txt:匹配当前目录下所有扩展名为 .txt 的文件。

file?.txt:
匹配 file1.txt、file2.txt,但不匹配 file10.txt(因为 ? 只匹配一个字符)。
这会将当前目录下所有扩展名为 .py 和 .sh 的文件移动到 folder 目录。

mv *{.py,.sh} folder    分解为    mv *.py *.sh folder
花括号扩展的高级用法:

(1)数字序列

echo {1..5}
# 输出 1 2 3 4 5

(2)带步长的数字序列

echo {1..10..2}
# 输出 1 3 5 7 9

(3)字母序列: 

echo {a..e}
# 输出 a b c d e

复杂目录结构的创建:

mkdir -p project/{src/{main,test},lib,bin,docs}

目录结构:

project/
├── bin/
├── docs/
├── lib/
└── src/
    ├── main/
    └── test/
 (6)shell 脚本中的重定向
        (1)标准输入、输出和错误流
  • 标准输入(文件描述符 0)。
  • 标准输出(文件描述符 1)。
  • 标准错误(文件描述符 2)。
#!/bin/bash
echo "这是标准输出"
echo "这是标准错误" >&2
        (2)重定向操作符 (>, >>, <)
  • > 将输出重定向到文件(覆盖)。
  • >> 将输出追加到文件。
  • < 从文件中读取输入。
#!/bin/bash
echo "追加内容" >> output.txt
cat output.txt
        (3)文件描述符和重定向 (2>&1
  • 2>&1 将标准错误重定向到标准输出。
#!/bin/bash
echo "标准输出" > combined.log

# 重定向到标准错误流  
echo "标准错误" >&2

# >:将标准输出重定向到 output.txt 文件。
# 2>&1:将标准错误重定向到标准输出,因此标准错误也被写入 output.txt 文件。

ls /nonexistent > output.txt 2>&1
(7)特殊文件
  • /dev/null 是一个特殊文件,丢弃所有写入它的数据。
  • 将不需要的输出重定向到 /dev/null
#!/bin/bash
echo "这条信息将被丢弃" > /dev/null

ls /nonexistent > /dev/null 2>&1

shell 工具

覆盖了程序员绝大部分的需求的工具:

  • 文件管理 - cdpwdmkdirrmdirlscprmmvtar
  • 文件检索 - catmorelessheadtailfilefind
  • 输入输出控制 - 重定向, 管道, teexargs
  • 文本处理 - vimgrepawksedsortwcuniqcuttr
  • 正则表达式
  • 系统监控 - jobspstopkillfreedmesglsof
    • 可以先从简单的尝试开始, 用得多就记住了, 记不住就man

find命令

(1)find 命令简介
  • 基本语法:find [path] [expression]
  • 默认行为:find .(查找当前目录中的所有文件和目录)
(2)按名称搜索
  • -name:按名称查找文件。
  • 通配符:*?[ ]
查找当前目录下所有txt文件

find . -name "file.txt"
(3)按类型搜索

  • 使用 -type 过滤文件类型。
  • 概念:
    • -type f:普通文件。
    • -type d:目录。
查找当前目录中的所有目录(含子目录

find . -type d
(4)按大小搜索 
  • 阅读: 使用 -size 过滤文件大小。
  • 概念:
    • -size +n:大于 n 块。
    • -size -n:小于 n 块。
    • -size n:正好 n 块。
查找所有大于 1mb 的文件。

find . -size +1m
(5)组合条件
  • 阅读: 使用 -and-or-not 组合多个条件。
  • 概念:
    • -and-a:逻辑与。
    • -or-o:逻辑或。
    • -not!:逻辑非。
查找所有大于 1mb 的 .vsix 文件。

find . -size +1m -and -name "*.vsix"
(6)执行命令
  • 阅读: 使用 -exec 在找到的文件上执行命令。
  • 概念:
    • -exec:在每个文件上执行一个命令。
    • {}:当前文件的占位符。
    • \;:命令的结束符。
查找所有 .txt 文件并删除它们。

find . -name "*.txt" -exec rm {} \;
(7)时间匹配
  • -mtime n:匹配修改时间为 n 天前的文件。
  • -atime n:匹配访问时间为 n 天前的文件。
  • -ctime n:匹配状态改变时间为 n 天前的文件。
  • -mmin  -n:过去 n 分钟内修改的文件。 (eg. -mmin -10)
(8)用户和组匹配
  • -user name:匹配属主为 name 的文件。
  • -group name:匹配属组为 name 的文件。
(9)权限匹配
  • -perm mode:匹配权限为 mode 的文件。
(10)打印
  • -print:打印匹配的文件。
  • -print0:打印匹配的文件,并以空字符分隔(用于处理文件名中包含空格的情况)。
(11)简化输出
  • head:显示文件的前几行内容。
  • 语法head [option] <file>
  • 关键点
    • 默认显示前10行。
    • 使用 -n <number> 选项指定显示的行数。

xargs命令

用于将标准输入的数据转化为命令的参数

(1)使用 findxargs 查找并删除文件。

使用 -0 选项,以 null 字符作为输入分隔符

使用 -print0 选项以 null 字符(\0)分隔每个文件名。 

find . -name "*.log" -print0 | xargs -0 rm
(2)使用 findxargs 查找并压缩文件。
find . -name "*.html" -print0 | xargs -0 zip html_files.zip

vim

(1)基本操作

  • 尝试退出 vim,不保存更改:
    • 输入 :q
    • 输入 :q! 强制退出
  • 保存并退出:
    • 输入 :wq

(2)基本编辑命令

  • 删除文本:
    • 将光标移到 delete me,按 dd 删除整行。
  • 复制和粘贴:
    • 将光标移到 copy me,按 yy 复制整行,按 p 在当前行后粘贴。
  • 撤销和重做:
    • u 撤销刚才的粘贴操作,按 <c-r> 重做粘贴操作。             

(3)查找和替换

  • 查找文本:
    • 输入 /vim 查找 vim,按 n 跳到下一个匹配项。
  • 替换文本:
    • 输入 :%s/vim/neovim/g 替换所有 vimneovim

(4)多窗口编辑

  • 打开并分割窗口:
    • 在 vim 中输入 :split practice6-2.txt 打开第二个文件并进行水平分割。
    • 使用 <c-w>h<c-w>j 在窗口间切换。

(5)自定义 vim

创建 .vimrc 文件并进行基本配置:
vim ~/.vimrc

set number            " 显示行号
syntax on             " 语法高亮
set tabstop=4         " 设置 tab 宽度为 4
set expandtab         " 用空格替代 tab


 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com