先写一个皮毛学习,估计连皮毛学习都不算🤭。后面有时间在补充深入学习🐊(到处留小尾巴)。
额,为啥要学习呢,实际上是因为学习nginx
的时候涉及到使用shell
脚本实现日志切割。所以想先了解下shell
(反正行走江湖,技多不压身。了解一下)。学习资料就时shell脚本学习指南.pdf
本来想上传一个免费的上去,不过发现存在重复资源。有需要的可以留言或者私信我留下邮箱。当然网上也有免费资源可以下,只是需要找啦。当然这一篇是不可能有太多东西的,所以基本营养不多,都是基本的,路过的大神多多指点
Shell脚本的三大特性:
简单性:高级解释型语言,可以简洁的表达复杂的操作。
可移植性:使用POSIX定义的功能,使得脚本无需修改就可在不同系统上执行。
易开发:耗时短。即短时间内就可以完成一个功能强大又好用的脚本。
# 授权
chmod +x
第一个shell脚本
#!/bin/bash -
who | wc -l
Tip: #! /bin/bash -
中的-
表示没有shell选项;基于安全考虑,可避免某种程度的欺骗式攻击。#!前后不能有空格等其他字符,否则,执行脚本失败"-bash: ./finduser: bin/sh: bad interpreter: No such file or directory"
几个初级陷阱:
#!
这行的长度限制从63到1021字符都有,尽量不要让这行长度超过64位字符一些常见的命令
who:当前系统上登录用户
echo:标准输出
printf:与echo相比,需要在结尾使用n换行.
基本的I/O重定向:标准输入/输出(<)、标准错误输出(>)----默认三者在终端
tr:translate的简写,主要用于压缩重复字符,删除文件中的控制字符以及进行字符转换操作。-s:压缩字符-d:删除字符-t:字符替换,可以省略格式:echo "abcddel" | tr -d "d" ====> adcel
|:建立管道,program1|program2 //前一个的标准输出为后一个的标准输入
#:注释grep:查找可配合+正则表达式 🐊
# cut:切分文件,具体参考🐊
# awk:一个强大的文本分析工具。🐊
不需要声明类型,直接创建即可。
变量的初始值都为空(null)且变量赋值是没有长度限制的,这里要注意shell
中变量赋值的时候不要存在空格
# 错误
a = jimmy
# 正确
a=jimmy
#!/bin/bash
_name=jimmy
echo $_name
echo ${_name}
echo _${name}_
echo _$_name_
##### 下面为输出结果
> ./variablePrc
jimmy
jimmy
_jimmy_
_# 这里最后一种形式不是我们想要的结果,只是错误示例展示
POSIX Shell中其他的内置变量:显示时都是$…
?:前一个命令的退出状态
$:Shell进程的进程编号(process ID)
0:Shell程序的名称
!:最近一个后台命令的进程编号.
IFS:内部的字段分隔器.例如单词分隔,一般为空格、制表符或换行.
HOME:根目录
LANG:当前locale的默认名称
PATH:命令的查找路径
PPID:父进程的进程编号
PWD:当前工作目录
POSIX Shell的结束状态:
0:在重定向或单词展开期间
1-125:命令不成功地退出
126:命令找到了,但文件无法执行
127:命令找不到
128:未定义
可以使用exit命令传递一个退出值给它的调用者,退出脚本。
echo命令涉及内容比较多,以后会单独进行学习🐊。这里只是简单的说明下
> echo jimmy
jimmy
> echo 'jimmy'
jimmy
> echo "jimmy"
jimmy
> echo "jimmy!"
# 双引号不能打印感叹号 关于这部分后面我们在进行实验学习
-bash: !": event not found
echo 遇到转义序列时,会打印相应的字符。有效的转移序列如下:
序列 | 说明 |
---|---|
a | 警示字符,通常是ASCII的BEL字符 |
b | 退格 |
c | 输出是忽略最后的换行字符,这个参数之后的任何字符都会被忽略 |
f | 清除屏幕 |
n | 换行 |
r | 回车 |
t | 水平制表符 |
v | 垂直制表符 |
反斜杠字符 | |