数组:有下标
格式:名称=(元素 元素...元素)
操作
通过下标获取元素
格式:${数组名称[下标]}
注意:当下标为*时,表示所有 没有下标表示数组中下标为0
获取长度:
格式:${#数组名称[*]}
注意:元素和元素之间以空格进行分割,因为shell中没有数据类型限制,数组中可以同时存储不同的数据类型
数组举例:
1、
#/bin/sh
array=(1 2 3 4 5)
echo -n "数组的数据为:"
echo ${array[*]}
echo -n "数组的长度为:"
echo ${#array[*]}
2、
#/bin/sh
#对数组进行遍历
array=(1 2 3 4 5)
#方式一:
for ((i=0;i<=$[${#array[*]}-1];i++))
do
echo ${array[${i}]}
done
echo "----------------"
#方式二:
for j in ${array[*]}
do
echo ${j}
done
echo "----------------"
#关于方式二给值的拓展1:
for x in {1..5}
do
echo ${x}
done
echo "---------------"
#关于方式二给值的拓展2:
for y in `seq 1 5`
do
echo ${y}
done
echo "---------------"
#关于方式二给值的拓展3:
#注意:如果只有一个值,表示结束(从1开始到结束)
for z in `seq 5`
do
echo ${z}
done
键盘录入
格式: read 变量名称
注意:变量不需要进行初始化
echo
选项
不加:输出并换行
-n:输出不换行
for循环
格式1:java格式for循环
for ((i;i<=10;i++))
do
执行的代码
done
格式2:python格式for循环
for 变量 in 值
do
执行的代码
done
给值的格式
格式1:{开始..结束}
格式2:`seq 开始 结束`
注意:如果只有一个值,表示结束(从1开始到结束)
累加:
格式:osum=
[
值
+
值
]
使
用
l
e
t
:
再
使
用
变
量
时
,
不
需
要
使
用
[值+值] 使用let:再使用变量时,不需要使用
[值+值]使用let:再使用变量时,不需要使用去引用变量
格式:let osum+=i
案例:循环获取1-100奇数和和偶数和
for ((i=1;i<=100;i++))
do
if ((${i}%2==0))
then
#osum+=${i} #做的是拼接
osum=$[${osum}+${i}]
else
#jsum=$[${jsum}+${i}]
#使用let时,变量不需要再$去引用了 可以直接写
let jsum+=i
fi
done
案例:遍历数组
list=(1 2 3 4 5)
java格式遍历
for ((i=0;i<=$[${#list[*]}-1];i++))
do
echo ${list[${i}]}
done
pyhton格式遍历
for i in ${list[*]}
do
echo ${i}
done
案例
打印直角在左下三角形
#打印5*5的直角三角形
for ((i=1;i<=5;i++)) #外循环决定行
do
for ((j=1;j<=${i};j++)) # 第一行一列 第二行有两列
do
echo -n "* "
done
echo ""
done
for循环举例:
#/bin/sh
echo -n "请输入上、下限数字:"
read max min
for ((i=${min};i<=${max};i++))
do
if ((${i}%2==0))
then
osum=$[${osum}+${i}]
else
jsum=$[${jsum}+${i}]
fi
done
echo "${min}-${max}偶数和为:"${osum}
echo "${min}-${max}奇数和为:"${jsum}
函数(方法)
方法定义格式:方法名称(){
代码体
return 值
}
方法调用格式:直接使用方法名称
**注意:方法调用在方法定义之下**
参数
$0:永远是脚本名称(忽略不做为参数)
写在方法调用之后
从$1开始接收
$#:参数的长度(不包含脚本名称)
$*:获取所有的参数
返回值
注意:返回值只能是数字
通过$?去接收
只能接收一次,没有返回值接收的就是当前状态
函数举例:
1、
#/bin/sh
fun ()
{
echo "这个一个函数"
return 10 #返回值只能是数字
}
fun
#通过$?去接收返回值, 只能接收一次,没有返回值接收的就是当前状态(默认为0)
echo $?
2、
#/bin/sh
fun()
{
echo $0 #$0:永远是脚本名称(忽略不做为参数)
$1
$2
}
fun
#$#:参数的长度(不包含脚本名称)
echo $#
#$*:获取所有的参数
echo $*
shell日期
获取当前日期时间
date +"%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流中写入错误信息。
例如:标准输出文件写入到文件中
ll test.txt error.txt
有两条结果,一条正确的 一条错误的
ll test.txt error.txt > test.txt 默认是把正确文件信息写入
ll test.txt error.txt 1> test.txt 默认是把正确文件信息写入
ll test.txt error.txt 2> test.txt 默认是把错误文件信息写入
ll test.txt error.txt > test.txt 2>&1
有两条结果,一条正确的 一条错误的,>test.txt默认把正确信息写入,想要都写入 需要把错误信息当做正确信息一起写入(2>&1)
重定向举例:
定时器
例子:工作中,需要处理一天的数据(等到0-24之后),但是生活中不可能等到24点之后处理再回家
并且处理的代码(脚本)内容一样(每天的数据格式都是一样的,处理的内容也是一样的),需要每天执行一次(是在24之后),
可以通过定时器,对脚本或代码进行定时(第二天3点), 这时脚本或代码就会每天带这个时间点就会执行,自己就可以正常回家 等待二天上班查看任务是否执行成功
格式:*(分钟) *(小时) *(日) *(月) *(星期) command
创建定时任务:通过crontab -e 打开crontab文件按照定时器格式进行书写
例如:* * * * * sh /usr/local/soft/shell2/data.sh (每分钟执行一次)
查看定时器的执行情况
tail -f /var/log/cron(文件表示定时器的执行日志)
注意:脚本路径需要给上全路径
定时器举例:
主要是在定时器文件里写了每一分钟追加在test.txt存储一行"hello"