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:提供额外的控制功能,仅对某些文件有效(如
setuid
、setgid
和sticky
位)。
管道符号
(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 可以是always
、auto
或never
。-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 工具
覆盖了程序员绝大部分的需求的工具:
- 文件管理 -
cd
,pwd
,mkdir
,rmdir
,ls
,cp
,rm
,mv
,tar
- 文件检索 -
cat
,more
,less
,head
,tail
,file
,find
- 输入输出控制 - 重定向, 管道,
tee
,xargs
- 文本处理 -
vim
,grep
,awk
,sed
,sort
,wc
,uniq
,cut
,tr
- 正则表达式
- 系统监控 -
jobs
,ps
,top
,kill
,free
,dmesg
,lsof
- 可以先从简单的尝试开始, 用得多就记住了, 记不住就
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)使用 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
发表评论