管道符号
(1)管道符号 |
将前一个命令的输出作为下一个命令的输入
例如:
以下为 ./semester输出中提取包含 "Last-Modified" 的行并写入文件 last-modified.txt
./semester | grep "Last-Modified" > ~/last-modified.txt
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
(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)
(1)通配符
- 星号
*
:匹配任意数量的字符(包括零个字符)。- 问号
?
:匹配任意一个字符。
示例:
*.txt:匹配当前目录下所有扩展名为 .txt 的文件。
file?.txt:
匹配 file1.txt、file2.txt,但不匹配 file10.txt(因为 ? 只匹配一个字符)。
(2)花括号
{}
用于展开命令花括号扩展是一种用于生成一系列字符串的方法.
这会将当前目录下所有扩展名为 .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/nullls /nonexistent > /dev/null 2>&1
Shell 工具
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"
-
(5)执行命令
- 阅读: 使用
-exec
在找到的文件上执行命令。 - 概念:
-
-exec
:在每个文件上执行一个命令。 -
{}
:当前文件的占位符。 -
\;
:命令的结束符。查找所有 .txt 文件并删除它们。
find . -name "*.txt" -exec rm {} ;
-
xargs命令
用于将标准输入的数据转化为命令的参数
(1)使用 find
和 xargs
查找并删除文件。
使用 -0
选项,以 null 字符作为输入分隔符
使用 -print0
选项以 null 字符(\0
)分隔每个文件名。
find . -name "*.log" -print0 | xargs -0 rm
(2)使用 find
和 xargs
查找并压缩文件。
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
替换所有Vim
为NeoVim
。
- 输入
(4)多窗口编辑
- 打开并分割窗口:
- 在 Vim 中输入
:split practice6-2.txt
打开第二个文件并进行水平分割。 - 使用
<C-w>h
和<C-w>j
在窗口间切换。
- 在 Vim 中输入
(5)自定义 Vim
创建 .vimrc 文件并进行基本配置:
vim ~/.vimrc
set number " 显示行号
syntax on " 语法高亮
set tabstop=4 " 设置 tab 宽度为 4
set expandtab " 用空格替代 tab