您当前的位置:主页 > 技术探讨 >
shell脚本基础(二)
发布时间:2017-02-25 19:39编辑:admin阅读()
今天的内容比较接近应用层次,通过相关命令可以写出我们想要的效果,想要查看更多的嵌入式内容可以到我的简书中查看更多的文章。
作业
1.写一个命令求阶乘或是求和,比如说命令运行:
./xx.sh 6! 如果是这样运行就执行阶乘6x5x4x3x2x1
./xx.sh 6+ 如果是这样运行就执行阶乘6+5+4+3+2+1
//下面是老师给我们留的不正确的答案,可能是老师觉得问题较简单,并没有正面解决这个问题,百度上有求阶乘或是求和的答案
arg1=$1
if [ $# != 1 ]
then
echo "参数过多或过少!!!"
else
arglength=${#arg1}
let start=arglength-1
op=${arg1:start:1}
num=${arg1:0:start}
case $op in
"+")
sum=0
i=1
while [ $i -le $num ]
do
let sum=sum+i
let i++
done
echo "sum=${sum}"
;;
"!")
result=1
i=1
while [ $i -le $num ]
do
let result=result*i
let i++
done
echo "result=${result}"
;;
"*")
echo "usage:./xx.sh 6+ or ./xx.sh 6!"
;;
esac
fi
3.使用while循环打印如图所示的直角三角形
*
**
***
****
*****
******
row=1
colum=1
while [ $row -le 6 ]
do
colum=1
while [ $colum -le $row ]
do
printf "*"
let colum++
done
printf "\n"
let row++
done
4.打印乘法表
row=1
colum=1
while [ $row -le 9 ]
do
colum=1
while [ $colum -le $row ]
do
printf "%dx%d=%-2d" ${colum} ${row} $((colum*row))
let colum++
done
printf "\n"
let row++
done
5.创建当天文件夹
year=`date +%Y`
mouth=`date +%m`
day=`date +%d`
arg1=$1
if [ $# -eq 0 ]
then
mkdir -p ~/practice/$year/$mouth/$day
echo "${year}文件创建完成!!!"
cd ~/practice/$year/$mouth/$day
elif [ $# -eq 1 ]
then
case $arg1 in
"y")
mkdir -p ~/practice/$year/$mouth/$day
echo "${year}文件创建完成!!!"
cd ~/practice/$year
;;
"m")
mkdir -p ~/practice/$year/$mouth
echo "${mouth}文件创建完成!!!"
cd ~/practice/$year/$mouth
;;
"d")
mkdir -p ~/practice/$year/$mouth/$day
echo "${day}文件创建完成!!!"
cd ~/practice/$year/$mouth/$day
;;
"*")
echo "用法"
echo "1>-y:产生当年文件夹"
echo "2>-m:产生当月文件夹"
echo "3>-d:产生当日文件夹"
;;
esac
else
echo "用法"
echo "1>-y:产生当年文件夹"
echo "2>-m:产生当月文件夹"
echo "3>-d:产生当日文件夹"
fi
16、数组
1>数组是保存多个变量的一个集合
2>数组的定义
1 array={1 2 3 4 5}
或
4array1[0]=2
5array1[1]=3
6array1[2]=5
7array1[3]="hello"
9echo "${array1[*]}"
3>数组的输出
2echo "${array[@]}"
3echo "${array[*]}"
4>数组元素的访问
${array[下标]}
下标的范围:0~数组的大小-1
数组元素访问越界,默认值为空
注意点:数组定义可以隔开定义,最好从0开始
17、shell函数
1>什么是函数
函数就是一个包,包代码
案例入门:
1func()
2{
3 i=0
4 while [ $i -le 9 ]
5 do
6 printf "=====\n"
7 let i++
8 done
9}
10func
2>函数存在的意义
1)方便管理,提高代码的重复使用
2)模块性,功能性,提高以后的工作效率
3>函数格式
[functino]functinoname() \\[function]可有可无
{
语句体
}
4>函数调用
functionname
5>return的作用
1)return代表结束函数的运行,return下面的函数不会被执行
2)将return后面的值返回出去
注意点:return num出来的值num只能在0-255之间,如果num大于255,那么实际return的结果是num%256;
实在需要返回一个num大于255,用echo,如果想要接受一个echo出来的值,使用``或$()
6>$?的作用
$?是接收最后运行的一个函数返回出来的结果
7>函数接收变量的值
函数内部
$0:./xx.sh
$1:代表函数后面的第一个参数
$2:代表函数后面的第二个参数
···
$n:代表函数后面的第n个参数
当n>=10时,就写为${n}
$#:代表函数后面的参数个数
函数外部
$0:./xx.sh
$1:代表xx.sh后面的第一个参数
$2:代表xx.sh后面的第二个参数
···
$n:代表xx.sh后面的第n个参数
$#:代表命令后面的参数个数
8>函数定义注意点
1)函数内部可以定义函数
2)条件函数根据具体的条件定义
3)怎么保证函数一定调用成功
只要能够保证函数调用之前,只要有这个函数的定义就可以了
unset num:清空
9>如果没有指明某个变量的作用域,那么他的作用域全局的,所有我们一般情况下,如果不希望外面拿到函数内部的值,我们指明这个函数的作用域,用local修饰,代表这个变量只能在这个函数内部使用
作业:
自己写一个mycal命令,最好使用函数
1>mycal,出现当年当月的函数
2>mycal 2016.6出现的2016.6月的日历
3>mycal 2016,显示整年
已知条件
1>1990.1.1是星期一
2>闰年的条件
1)能被4整除,且不能被100整除
或者
2)能被400整除