shell是一个用c语言编写的程序,是用户操作linux的桥梁
(与终端的区别是shell一次可以执行多条命令)
1、创建:后缀为.sh的文件
vim shell01.sh
2、编写:
头部注释为#!/bin/sh或者#!/bin/bash
3、运行:
1)通过sh命令执行
sh shell01.sh
2)通过bash命令执行
bash shell01.sh
3)通过把文件修改为可执行的文件(绿色)然后通过./文件命令.sh来执行
chmod 777 shell01.sh
./shell01.sh
变量(shell中没有具体数据类型的限制,只有string,并且必须初始化)
1)定义和初始化
格式:变量名称=值
例如:x="helloworld"
注意:变量,等号和值之间不能有空格
2)变量的引用
格式1:$变量
格式2:${变量}
注意:$会将$之后所有连续的内容当作变量,直到遇到下一个$
可以通过{}给变量加边界
shell脚本的位置变量
位置变量$1,$2,...,${10},...
从$1开始(因为$0永远都是脚本名称)shell已经规定的位置变量,用不用位置都在那,只不过有的做了输出(接受并在控制台显示了),有的没有做输出(只接受并未在控制台显示)
下标大于一位数只能使用${}获取参数,因为$下标只把第一位数据看做下标
$*获取所有参数
$#获取所有参数个数
引号
单引号:单引号中的内容原样输出
双引号:可以引用变量,拥有特殊含义的内容
注意:引号是成对出现的,相连两个引号是一对
符号:1.默认不显示的,引号,$
2.默认显示的,?,*
转义符\默认不显示,将转义符后面第一位符号的含义进行修改
字符串的一些操作
拼接:连续获取变量
注意:如果有多个引号,连续的形成一对
引号中使用其他引号,其他引号做字符串使用
字符串
1)获取字符串长度
格式:${#变量}
2)截取
格式:${变量名:开始位置:长度}
注意:${str::5} 从开始获取5个
${str:0} 从开始获取到末尾(${str})
3)替换
格式:${变量/旧/新} 替换单个
格式:${变量//旧/新} 替换所有
注意:替换不会在原字符上进行修改,想要修改原字符串只能从新赋值
4)删除
从头开始删除
${变量#表达式}:匹配第一个删除
${变量##表达式}:匹配最后一个删除
从尾开始删除
${变量%表达式}:匹配第一个删除
${变量%%表达式}:匹配最后一个删除
注意:从未开始删除,表达式还是从左向右去写
删除不会再原字符上进行修改,想要修改原字符串只能从新赋值
运算符
1)算术运算符:加,减,乘,除
bash不支持简单的数学运算,可以通过命令实现expr,反引号`
格式1:`expr 值 + 值`
注意:+两边需要加上空格
格式2:$[值+值]
2)比较运算符: > < >= <=....
echo $[2>1&2<1]
注意:比较的结果用1(true)和0(false)表示
3)逻辑运算符: &/and |/or !/not
echo $[!2>1]
shell流程控制语句
1)if语句
格式1:if 判断条件
then
判断为true执行的代码
fi
格式2:if 判断条件
then
判断为true执行的代码
else
判断为false执行的代码
fi
格式3:if 判断条件
then
判断为true执行的代码
elif 判断条件
then
判断为true执行的代码
.....
else
判断为false执行的代码
fi
注意:else可加可不加
2)for循环
java格式:
for ((初始化变量;判断条件;控制语句))
do
执行语句
done
python格式:
for 变量 in 结果集
do
执行语句
done
结果集:
{开始..结束}含头含尾,不能引用变量
`seq 开始 结束`含头含尾,可引用变量,变量需加$
`seq 1 100`
`seq $a $b`
注意:使用let在计算时可以直接使用变量
数组:存储多个元素,数据类型可以不同,元素元素之间以空格切分
格式:数组名=(值1 值2 ... 值n)
注意:直接引用数组变量,默认获取下标为0的元素
获取某个元素:${数组[下标]}
获取数组长度:${#数组[*]}
获取数组所有元素:${数组[*]}
read:键盘录入
格式:read 变量1 变量2 ...变量n
(类似于可变参数,多余的输入的值归为最后一个变量)
注意:键盘录入时,允许给多个变量进行赋值,值和值之间以空格切分
函数
格式:
function 方法名(){
方法体
return 数字;
}
注意:function和return可加可不加
return只能返回数字范围在0-255之间,没有return就把方法体中最后一个命令的结果作为返回值(1.0表示执行成功的返回值 2.其他数字就是报错)
方法的调用:直接使用方法名不加()
$?接收返回值只能接收一次
函数的位置变量
$0...$n表示接收参数,$0永远是脚本名称(忽略)
注意:位置变量一旦涉及个位以上就需要打{ }作为边界,如${10}
获取当前日期时间
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(把错误信息当做正确信息去处理)
定时器:
格式:
*(分钟) *(小时) *(星期) *(几号) *(月份) commend
通过crontab -e添加定时任务
查看定时任务是否执行了,看日志tail -f /var/log/cron
注意:
定时器或脚本中涉及到路劲的全部给绝对路劲
* * * * * 每分钟
*/1 * * * * 每分钟
0 */1 * * * 每小时