shell定义
操作系统中有一个内壳,它主要是用来操控硬件的,而我们又不能直接去操控它,所以我们就可以在操作系统外面加一个壳,使用壳(shell)来操控内壳。shell是一个命令解释器,shell现在主要有二种语法:sh(sh和bash)和csh,而现在我们Linux中默认是使用bash,所以我们每次写脚本都要声明是bash,不声明也能执行。
shell脚本执行方式
shell一共有三种执行方式路径+脚本名、sh+脚本名、source+脚本名
注意:
①路径方式:在当前目录就可以直接使用./,或者使用绝对路径,但一个前提是给与他执行权限(chmod +x)才能使用;
②使用路径和sh执行的脚本不会打印直接设置的变量,除非是用export定义的变量。因为这两种方式是使用子进程执行的脚本,拿不到父进程.sh的数据,进程间数据不共享。
③export定义的变量会首先在当前进程查找数据,如果没有就会去父进程查找。
变量和字符串
声明变量可以用单引号,也可以用双引号,也可以不用引号。获取变量可以用$+变量名也可以在变量名前后加上大括号{}。
①使用加减乘除只会当作字符串连接。如str1=1,str2=2,echo $str1 + $str2结果等于1+2
②使用单引号定义的不会转义,使用双引号定义的会被转义。如str3=‘str1+2’,echo $str3=str1+2;str4=“str1+2”,echo
s
t
r
4
=
1
+
2
。
③
字
符
串
拼
接
直
接
连
着
写
,
不
用
什
么
拼
接
符
号
。
④
使
用
str4=1+2。 ③字符串拼接直接连着写,不用什么拼接符号。 ④使用
str4=1+2。③字符串拼接直接连着写,不用什么拼接符号。④使用{#变量名}获取变量的长度
⑤使用${变量名 : a : b}获得变量索引a到索引b的内容,索引从0开始。
数组
定义:数组名=(值1 值2 值3)用空格隔开
读取:
数
组
名
[
下
标
]
下
标
使
用
@
符
可
以
获
取
所
有
的
数
组
长
度
:
{数组名[下标]} 下标使用@符可以获取所有的数组 长度:
数组名[下标]下标使用@符可以获取所有的数组长度:{#数组名[下标]} 下标使用@符获取数组的长度,不然就获取某个下标的长度
注释
#单行注释
:<< 字符 字符 多行注释
运算符
①使用撇+expr修饰 如var = ~expr $a + $b~
②使用*时前面要加上\ 用来转义
③==和!= 判断等价关系
④关系运算:-eq相等 -ne不相等 -gt大于 -lt小于 -ge大于或等于 -le小于或等于
布尔运算: !非 -o或(条件一个true结果true) -a与(条件都是true结果才是true)
逻辑运算:&&短路与(前面是错的就不执行了) ||短路或(前面是对的就不执行了)
字符串运算: -z长度是否为0 -n长度不为0
文件测试运算:-r文件可读 -w文件可写 -x文件可执行 -f文件是普通文件 -d文件是目录 -s文件不为空 -e文件存在
打印数据:\n换行 \变量\显示转义 \c不换行 >文件名(覆盖)把结果放到文件名里面 date显示日期
⑤判断后面用中括号[]来写条件
流程控制
if
if [条件1]
then
结果1
elif [条件2]
结果2
else
结果3
fi
case
case 变量 in
结果1) echo '结果1'
;; #相当于Java中的break;
结果2) echo '结果2'
;;
*) #上述结果都不满足时
;;
esac
for
read 变量 键盘输入变量的值
相当于Java的for each
for 初始变量 in 数组或者变量集合(空格隔开)或者用双引号定义字符串逗号隔开
do
结果
done
while
bash 中let指执行一条或多条表达式,用作变量运算时不需要使用$修饰变量。如a累计加1,let"a++".
while (条件)
do
结果
done
结束循环
break结束整个循环
continue结束当前循环
函数
函数名(){
方法体
return
}
调用时通过$?函数名来获取函数返回值
输入参数时直接使用函数名+参数(参数用空格隔开)
同步时间
ntpdate cn.ntp.org.cn
修改时间:date -s 18:18:18 更改时间为18点18分18秒
显示年月日时分秒:date “+%Y%m%d%H%M%S”
开机启动脚本
①在/etc/rc.d/ 下的rc.local文件里加入执行脚本文件的路径(source /home/instart.sh),如果rc.local和脚本文件都不是可执行文件就给它加上可执行权限。
②把脚本放到/etc/init.d下,然后将脚本添加为自启动服务(chkconfig --add 脚本地址);
注意:脚本里要写 #chkconfig: 35 66 88,意思是启动顺序35启动进程服务名为66,其余杀死进程的名为88;
定时任务
在系统服务中心,crond负责周期任务
systemctl status crond.server #查看crond服务有没有启动
crontab -e #添加任务,编辑当前用户的任务列表
crontab -l #查看当前的定时任务
crontab -r #清除任务
vim /var/spool/mail/root
systemctl restart crond.server #重启周期任务服务,这样你改的任务才生效
● 编辑任务
星 星 星 星 星 command
分 时 日 月 周 命令
第一列表示分钟 0-59 每分钟用* 或者 */2表示
第二列表示小时 0-23(0表示0点)
第三列表示日期1-31
第四列表示月份1-12
第五列表示星期0-6 (0表示星期天)
第六列表示要运行的命令(如执行某个路径下的脚本文件)
* 表示任意时间都,实际就是“每”的意思
- 表示期间,如00 17-19 * * * cmd 就是每天的17,18,19小时执行任务
,表示分割时段,如00 17,19 * * * cmd 每天的17点和19点执行任务
/n 表示分割,可以看成是除法,每隔n执行一次,如*/5 * * * * 每隔5分钟执行一次
连接数据库
mysql -uroot -ppassword --connect-expired-password << EOF
SQL语句
commit;
quit
EOF