shell
学习脚本编程
shell用途
实现自动化
- 自动化批量初始化(update,软件安装)
- 自动化软件部署(tomcat,nginx)
- 管理应用程序(KVM,集群管理扩容,Mysql)
- 日志分析处理程序(PV,UV,200,!200,grep/awk,top 100)
- 自动化备份,恢复程序(Mysql完全备份/增量 + crond)
- 自动化管理程序(批量修改,升级,配置更新)
- 自动化信息采集,监控(收集系统/应用状态信息,CPU,内存,disk,apache,Mysql,tcp状态)Zabbix专业软件可实现采集
- 自动化扩容(增加云主机–>部署应用)通过监控
shell 打印
echo
echo是用于终端打印的基本命令
echo每次调用都会自动换行
输出的方式三种,无引号,双引号(需要转义),单引号(原样输出)
缺点
使用双引号打印遇到特殊字符就需要转义,或者不要使用双引号,换成单引号可原样输出
如果不使用引号,则没法再文本中显示;
,因为分号在bash中为命令界定
单引号的缺点是不能变量替换
printf
printf也是用于终端打印的基本命令:
printf使用引用文本或由空格分隔的参数。
%ns 输出一个字符串,n是数字代指输出几个字符
%ni: 输出整数
%d 整型输出,
%c 输出一个字符,
%f 输出实数,以小数形式输出。
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
%-10s 指一个宽度为 10 个字符(**-** 表示左对齐,没有则表示右对齐)
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
输出格式:
格式 | 功能 |
---|---|
\a | 输出警告声音 |
\b | 输入退格键 |
\f | 清楚屏幕 |
\n | 换行 |
\r | 回车 |
\t | 水平输出退格 |
\v | 垂直输出退格 |
文件描述符与重定向
文件描述符
文件描述符是与输入和输出流相关联的整数。常用的文件描述符是stdin、stdout和stderr
- 0 —— stdin(标准输入)
- 1 —— stdout(标准输出)
- 2 —— stderr(标准错误)
重定向
Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向;
输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
类 型 | 符 号 | 作 用 |
---|---|---|
标准输出重定向 | cmd >file | 以覆盖的方式,把 cmd 的正确输出结果输出到 file 文件中。 |
cmd >>file | 以追加的方式,把 cmd 的正确输出结果输出到 file 文件中。 | |
标准错误输出重定向 | cmd 2>file | 以覆盖的方式,把 cmd 的错误信息输出到 file 文件中。 |
cmd 2>>file | 以追加的方式,把 cmd 的错误信息输出到 file 文件中。 | |
正确输出和错误信息同时保存 | cmd >file 2>&1 | 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 |
cmd >>file 2>&1 | 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 | |
cmd >file1 2>file2 | 以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | |
cmd >>file1 2>>file2 | 以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | |
cmd >file 2>file | 【不推荐】这两种写法会导致 file 被打开两次,引起资源竞争,所以 stdout 和 stderr 会互相覆盖 | |
cmd >>file 2>>file |
例如:
#标准输出
echo ‘helllo world’ > hello.txt
echo ‘helllo world’ >> hello.txt
#结果
#‘helllo world’
#‘helllo world’
#标准错误输出重定向
cd sh 2> error.log
cd shell 2>> error.log
#结果
#-bash: cd: sh: No such file or directory
#-bash: cd: shell: No such file or directory
#正确输出和错误信息同时保存
#同一文件
cat 1.txt > out.log 2>&1
#结果
#cat: 1.txt: No such file or directory
#hello
#不同文件
cat 1.txt > out.log 2>error.log
如果既想把stdout
打印出终端,又想重定向至文件,就需要用到tee
命令
tee
命令
tee命令用于读取标准输入的数据,并将其内容输出成文件
cat a* |tee error.log
注意:tee只能读取stdin ,不能读取到stderr
默认情况tee为覆盖文件,等同于>
,加入-a
参数为追加内容,类似于>>
shell变量
定义变量
定义变量时,变量名和等号之间不能有空格
filename="jayce.txt"
定义命令
variable=`command`
variable=$(command)
定义规则
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线
_
- 不能使用标点符号
- 不能使用bash里的关键字
使用变量
在变量名前加$
name="Jayce"
echo $name
echo ${name}
注意:花括号可选,但最好加
只读变量
name="Jayce"
readonly name
添加了只读后,变量就不可以在变更值
删除变量
unset
unset可以删除变量
unset name
注意:unset不能删除只读变量
变量类型
与其他编程语言类似,shell有三种变量类型
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
shell字符串
在定义字符串的时候,有三种方法
- 单引号
- 单引号中任何字符都可以原样输出,不可嵌套变量
- 单引号中不可单独出现单独的单引号,转义也不行,但成对可以
- 双引号
- 双引号可以有变量
- 双引号可出现转义字符
- 不用引号
拼接字符串
- 双引号
your_name="Jayce"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
#输出 hello, Jayce ! hello, Jayce !
- 单引号
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
#输出 hello, Jayce ! hello, ${your_name} !
其中greeting_2中的变量其实并没有在单引号内
greeting_3中的变量未生效,被当做了字符串
获取字符串长度
`$