1.Shell概述
Shell 是一个命令行解释器,它接收应用程序、用户的命令,然后调用操作系统的内核
Shell还是一个功能强大的编程语言,易编写,易调试,灵活性强
1.1.Linux中提供的Shell解析器有:
[root@master datas]# cat /etc//shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
1.1 bash和是的关系
[root@master ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
1.2 Centos默认的解析器是bash
[root@master /]# echo $SHELL /bin/bash
2.Shell脚本基础
2.1 脚本格式
shell操作linux的桥梁
创建:
后缀为.sh的文件
编写:
头部注释为#!/bin/sh或者#!/bin/bash(注释可写可不写,建议写上)
运行:
1.通过sh命令执行
例如:sh helloworld.sh
#!/bin/bash echo "helloworld"
2.通过bash命令执行
例如:bash helloworld.sh
3.通过把文件修改为可执行的文件然后通过./文件命令.sh来执行
例如:./helloworld.sh(必须在当前目录下)
2.2系统预定义变量
1)常用系统变量
$HOME、$PWD、$SHELL、$USER等
2)查看系统变量的值
[root@master /]# echo $HOME /root [root@master /]# echo $PWD /
3)显示当前Shells中所有的变量:set
[root@master /]# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostco mplete:interactive_comments:progcomp:promptvars:sourcepathBASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=()
3.自定义变量
3.1 基础语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly变量,注意:不能unset
3.2 变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
3.3 案列
1)定义和初始化
格式
变量名称=值
例如:
x=10 "abc edefg"
注意:
等号两边不能有空格
2)使用:通过$区分变量还是一句话
格式1:
$变量
格式2:
${变量}
注意:
格式1,会把$后所有相连内容看做一个变量
格式2,${}表示值引用{}之中的内容分,对相连的内容做了一个区分
4.特殊变量
4.1 $0...$n:表示接收外部参数(执行脚本时,传递的参数
格式:
$下标
注意:
$0永远表示脚本名称(所以脚本名称不算数,$0也不算第一个参数)
下标大于一位数只能使用${}获取参数,因为$下标只把第一位数据看做下标
$*获取所有参数
$#获取所有参数个数(数组集合需要使用)
4.2 引号:
单引号:安原字符串输出
双引号:可以引用变量,拥有特殊含义的内容
拼接:连续获取变量
注意:
如果有多个引号,连续的形成一对
引号中使用其他引号,其他引号做字符串使用
# 变量后面的值,可以使用多个成对出现引号包起来
# 连续的引号是成对的
# 每对引号之间不能有空格(空格会把值做一个切分,会报错)
4.3 字符串
1)获取长度
格式:
${#变量}
2)截取:
格式:
${变量:开始位置:长度}
注意:
${str::5}:从0获取5个
${str:0}:从0获取到末尾
3)替换单个
格式:
${变量/旧/新}
注意:从左向右替换第一个
4)替换所有
格式:
${变量//旧/新}
注意:替换不会再原字符上进行修改,想要修改原字符串只能从新赋值
5)删除
从头开始删除
${变量#表达式}:匹配第一个删除
${变量##表达式}:匹配最后一个删除
从尾开始删除
${变量%表达式}:匹配第一个删除
${变量%%表达式}:匹配最后一个删除
注意:
从未开始删除,表达式还是从左向右去写
删除不会再原字符上进行修改,想要修改原字符串只能从新赋值
#!/bin/sh str="abcadefga" #获取长度 ${#变量} echo ${#str} #截取 ${变量:开始位置:长度} echo ${str::5} #0-5 echo ${str:0} #0-最后 #替换单个 ${变量/旧/新} echo ${str/a/b} #从头开始删除 # ${变量#表达式}:匹配第一个删除 # ${变量##表达式}:匹配最后一个删除 #从尾开始删除 # ${变量%表达式}:匹配第一个删除 # ${变量%%表达式}:匹配最后一个删除 echo ${str#a} echo ${str##a} echo ${str%a} echo ${str%%a}
[root@master datas]# sh str.sh 9 abcad abcadefga bbcadefga bcadefga bcadefga abcadefg abcadefg
5.字符串
5.1 算数运算符
bash不支持简单的数学运算,可以通过命令实现expr
格式1:
`expr 值 + 值`
注意:符号两边需要加上空格
格式2:
$[值+值]
#!/bin/sh x=12 y=10 echo `expr 10 + 12` echo $[x+y]
5.2比较运算符
格式:
$[值符号值](符号两边空格加不加无所谓)
注意:比较的结果用1(true)和0(false)表示
符号表示:
== 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
注意:可以用\<,\>,=,==,表示+= 需要用let关键字,<=需要双括号
5.3 逻辑运算符
&/and |/or !/not
例如:
#判断2>1结果
echo $[2 > 1]
#反转2>1结果
echo $[!$[2>1]]
# 反转后面的结果2>1 and 2>3 false0
echo $[!$[$[2>1]&$[2>3]]]
echo $[2>1 & 2<1]
6.if判断
格式1:
if 判断条件
then
判断为true执行的代码
fi
格式2:
if 判断条件
then
判断为true执行的代码
else
判断为false执行的代码
fi
格式3:
if 判断条件
then
判断为true执行的代码
elif 判断条件
then
判断为true执行的代码
。。。
else
判断为false执行的代码
fi
注意:else可加可不加
#!/bin/sh a=21 b=10 sorce=1 if ((a>b)) then echo "true" fi if((sorce==100)) then echo "满分" elif ((sorce>=60)) then echo "及格" else echo "不及格" fi
[root@master datas]# sh if1.sh
true
不及格
判断条件的写法
[]:[]两边加空格,符号两边加空格并且符号前加转义符
可以使用字母
[[]]:[[]]两边加空格,符号两边加空格
可以使用字母
():弃用
(()):不需要加空格,但是不能使用字母(建议使用这个)
在使用变量时,不需要使用$
7.for循环
java格式:
for ((初始化变量;判断条件;控制语句))
do
执行语句
done
python格式:
for 变量 in 结果集
do
执行语句
done
结果集:
{开始..结束}含头含尾,不能引用变量
`seq 开始 结束`含头含尾
#!/bin/bash #九九乘法表 #java格式 for((i=1;i<10;i++)) do for((j=1;j<i+1;j++)) do echo -n "$j*$i "=$[$i*$j] done echo " " done #python 格式 for i in `seq 1 9` do for j in `seq 1 $i` do echo -n "$j*$i "=$[$i*$j] done echo " " done ~
[root@master datas]# sh for1.sh 1*1 =1 1*2 =22*2 =4 1*3 =32*3 =63*3 =9 1*4 =42*4 =83*4 =124*4 =16 1*5 =52*5 =103*5 =154*5 =205*5 =25 1*6 =62*6 =123*6 =184*6 =245*6 =306*6 =36 1*7 =72*7 =143*7 =214*7 =285*7 =356*7 =427*7 =49 1*8 =82*8 =163*8 =244*8 =325*8 =406*8 =487*8 =568*8 =64 1*9 =92*9 =183*9 =274*9 =365*9 =456*9 =547*9 =638*9 =729*9 =81 1*1 =1 1*2 =22*2 =4 1*3 =32*3 =63*3 =9 1*4 =42*4 =83*4 =124*4 =16 1*5 =52*5 =103*5 =154*5 =205*5 =25 1*6 =62*6 =123*6 =184*6 =245*6 =306*6 =36 1*7 =72*7 =143*7 =214*7 =285*7 =356*7 =427*7 =49 1*8 =82*8 =163*8 =244*8 =325*8 =406*8 =487*8 =568*8 =64 1*9 =92*9 =183*9 =274*9 =365*9 =456*9 =547*9 =638*9 =729*9 =81
8 .数组
存储多个元素,数据类型可以不同,元素元素之间以空格切分
操作
通过下标获取数据
格式:
$(数组[下标])
注意:
直接引用数组变量,默认获取下标为0的元素
下标使用*表示获取所有
获取长度:
格式:
${#数组[*]}
#!/bin/bash arr=(1 2 3 4 5 6 7 8 9) #通过下标获取数据 $(数组[下标]) echo $((arr[1])) #获取长度: ${#数组[*]} echo ${#arr[*]} #遍历数组 for ((i=0;i<${#arr[*]};i++)) do echo ${arr[i]} done
[root@master datas]# sh arr.sh
2
9
1
2
3
4
5
6
7
8
9
9. read 键盘录入
格式:
read 变量1 变量2 ...变量n
注意:
键盘录入时,允许给多个变量进行赋值,值和值之间以空格切分
打印三角形
for i in {1..5} do for j in `seq 1 ${i}` do echo -n "* " done echo "" done
10.函数
格式:
function 方法名(){
方法体
return 数字;
}
注意:
function和return可加可不加
$0...$n表示接收参数,$0永远是脚本名称(忽略)
方法的调用直接使用方法名不加()
return只能返回数字范围在0-255之间
$?接收返回值只能接收一次
获取当前日期时间 ate +"%Y-%m-%d %H:%M:%S" 格式化日期时间: date -d today +"%Y-%m-%d %H:%M:%S" 加减日期时间 date +%Y%m%d //显示前天年月日 date +%Y%m%d --date="+1 day" //显示前一天的日期 date +%Y%m%d --date="-1 day" //显示后一天的日期 date +%Y%m%d --date="-1 month" //显示上一月的日期 date +%Y%m%d --date="+1 month" //显示下一月的日期 date +%Y%m%d --date="-1 year" //显示前一年的日期 date +%Y%m%d --date="+1 year" //显示下一年的日期
重定向:执行命令的结果写写入到文件
标准输入文件(stdin):stdin的文件描述符为0,默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,向stderr流中写入错误信息。
使用>,>>默认是把正确信息写入文件
想要把错误信息和正确信息写入文件需要后面追加2>&1(把错误信息当做正确信息去处理)
11.定时器:
格式:
*(分钟) *(小时) *(星期) *(几号) *(月份) commend
通过crontab -e添加定时任务
查看定时任务是否执行了,看日志tail -f /var/log/cron
注意:
定时器或脚本中涉及到路劲的全部给绝对路劲
* * * * * 每分钟
*/1 * * * * 每分钟
0 */1 * * * 每小时