这章节需要一定前置知识,那就是了解如何编写shell脚本(Vim,下一篇会说)
shell的参数
假设现在我们编写了这么一个脚本:
!/bin/bash
echo “当前脚本名称为$0” echo “一共有$#个参数,分别是$*。” echo “第一个参数为$1, 第五个参数是$5。”
运行结果(红框部分是参数):
- 可以看到,我们在脚本后面跟了几个参数,分别是英文的1~6
- 我们发现$n 就是取第n个参数,脚本名为第0个参数。
- $# 可以统计参数个数,$* 将所有参数列出(命令通配符)
除此之外,还有以下特殊符号:
$0
- 脚本名$@
- 所有参数$?
- 前一个命令的返回值$$
- 当前脚本的进程识别码(pid)!!
- 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用sudo !!
再尝试一次。$(cmd)
- “cmd”代表可以执行的指令。如可以执行 $ (date) 等等
有了这上面的基础之后,我们再来看看这门课给出的case:
echo "Starting program at $(date)" # date会被替换成日期和时间
echo "Running program $0 with $# arguments with pid $$"
for file in "$@"; do
grep foobar "$file" > /dev/null 2> /dev/null # 我们将标准输出流和标准错误流重定向到“垃圾箱”,
if [[ $? -ne 0 ]]; then # 如果grep其返回值是0,则条件判断成立,执行then后面的语句;
echo "File $file does not have any foobar, adding one"
echo "# foobar" >> "$file"
fi
done
- [[ ]]是条件判断,-eq 的含义是“是否等于”
- 该例子是用 grep 搜索字符串 foobar,如果没有找到就将其最为注释追加到文件中。
通配符
通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,
中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。
花括号: { } 用于匹配文件的指定部分。
convert image.{png,jpg}
# 会展开为
convert image.png image.jpg # 这两者都满足匹配
查找
grep 查找关键词
grep命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep [过滤参数] [目标文件]”。
选项:
比较常用的参数:
- -n:参数用来显示搜索到信息的行号;
- -v:参数用于反选信息(即没有包含关键词的所有信息行)
- -R: 递归进入子目录并搜索所有文本文件。
- -C: 获取查找结果的上下文
实例:
- 首先ps -aux 输出所有进程
- | 称为管道符,可以把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入
- 以上命令的意思:将ps -aux 查看到的内容交给 grep 进行过滤,将 Firefox 的相关进程过滤出来。
find查找文件
find命令用于按照指定条件来查找文件,格式为“find [匹配参数] [寻找条件后执行的操作]”。
“Linux系统中的一切都是文件”。在Linux系统中,搜索工作一般都是通过find命令来完成的,它可以使用不同的文件特性作为寻找条件(如文件名、大小、修改时间、权限等信息),一旦匹配成功则默认将信息显示到屏幕上。
- 使用 -name 匹配名称,搜索名叫 new_log 的文件
- 使用 -iname可以忽略大小写进行匹配
find的其他参数选项:
# 查找所有名称为src,文件类型为“文件夹”的文件
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '**/test/**/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'
history查找命令
使用 history 查找用户输入命令的历史。也可以搭配grep使用,使其精确捕捉到特定指令。
还可以使用ctrl+R对命令历史记录进行回溯搜索。敲CtrL+R后您可以输入子串来进行匹配,查找历史命令行。(精确到某个位置,然后按“上”或“下”来选择指令)