目录
shell的作用
Shell是位于内核和用户之间的翻译官
Cat/etc/shells #查看etc下的shell
Shell的使用:
完成自动化运维
批量化的重复操作
结合crontab完成周期性任务
shell弱类型语言 定义变量时不需要事先定义它的数据类型 python 解释型语言
强类型语音 java c++go定义变量时需要事先定义它的数据类型 整数型 浮点型字符型boole类型
编写shell脚本的规范
Shell脚本的构成:
- 申明解释器
#!/bin/bash (默认的解释器)
#!/usr/bin/python (用python写脚本)
#作者,创作日期,脚本的功能 等维护信息
- 注释信息
以#开头,被注释的语句在脚本运行时是不会被执行的
- 可执行的语句
如果想让一个外部命令想要直接被调用,我们可以把他写入PATH环境变量当中
做个软链接,然后放入PATH环境的目录下
将其加入全局环境变量中
用source和 . 执行脚本的话,会在当前shell环境中执行脚本
Bash sh 绝对路径 相对路径 执行的脚本他们会创建一个子shell环境,并且在这个子shell环境中执行这个脚本
Env可以查看环境变量
Unset是可以删除变量的,而readonly不可以删,只读
Unset不能删除只读的环境变量,只有重启
重定向:
ls -lh &> log.txt #&>混合输出的效果
ls -lh > log.txt 2>&1 #把标准输出和错误输出全都输出给log.txt
ls -lh 标准输出 1 -- > 屏幕
> log.txt 1 --> log.txt
2>&1 2 --> 1 , 1 指向 log.txt ,所以 2 也就指向了 log.txt
定义变量:
定义变量不能以数字开头,而且变量名有大小写之分
双引号相对比单引号聪明,双引号可以引用值,而单引号不行
双引号输出:
单引号输出:
` ...... `这个符号表示调用
`...` 等同于 $(...)
定义变量的方法1:
变量名=变量值
定义变量的方法2:
read 变量名 从键盘输入中获取变量名的值
read -p "提示内容" 变量名
echo -n "提示内容"
如何设置全局环境
如果name前不加$,必须要用export来导出
然后要用source来运行,
read 变量名
/etc/profile /etc/bashrc /root/.bash_profile /root/.bashrc
系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)
不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc
~/.bashrc 当前用户每切换一个shell环境都会自动执行,执行 /etc/bashrc
/etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行
source /etc/profile
shell中基本的运算
shell默认只支持整数的运算
常用的运算表达式如下
i=$(expr 12 \* 5)
i=$((12*5))
i=$[12*5]
let i=12*5
let i++ i=$[$i+1]
let i-- i=$[$i-1]
let i+=2 i=$[$i+2]
let i/=2 i=$[$i/2]
位置变量:
10以后的位置变量必须要加上大括号{}
预定义变量:
$? 代表上一条命令或者脚本返回的状态码,返回值为0表示执行正确,为非0则表示执行异常
$0 代表脚本本身
$# 代表脚本后面跟的参数(位置变量)的个数
$* 不加双引号的话,$*和$@都代表脚本后面跟的所有参数,加上双引号,“$*”会把所有参数当做一个整体(此时参数数量为1)去看待
$@ 加上双引号“$@”会把脚本后面跟的每一个参数当做一个个体去看待
Return 退出函数时的返回值(0~255,超过的部分 %256 取余)