shell知识点

0.linux启动的步骤

设备加电----》BIOS自检-----》grub引导启动-----》加载内核----》系统初始化----》用户登录

1.文件目录大致结构

/:根目录
/bin:存储命令,/usr/bin存放用户命令
/root:超级管理员用户主目录
/etc:系统相关配置的文件
/home:家目录,存放用户的
/lib:共享库目录
/dev:设备目录
/mnt:一般作为挂载目录

2.终端的打开

1>ctrl+alt+t
2>点击左上角的搜索按钮,输入terminal,出来一个终端选项
注意:点击左边图标终端,将终端lock在桌面的左边

3.关机
1>右上角
2>在终端下怎么关机
(1)sudo shutdown -h now
(2)sudo init 0
(3)sudo reboot重启
3>关闭终端
exit
4>怎么获取超级管理员权限
su
?如果认证失败
(1)sudo passwd进行修改超级用户管理员权限的密码

5>超级用户管理员----》普通用户
exit

4.修改登录/用户密码
sudo passwd XXX用户

5.shell基本命令
1>pwd:present work directory显示当前的工作路径
2>ls:list显示当前工作路径下的目录或者文件
ls:显示当前目录下所有文件
ls -l:显示当前目录下所有文件并且告知文件的相关属性
ls -a:显示当前目录下所有文件(包括隐藏文件:点开头)
ls -al:集合上面两个特性
ls +具体路径:显示具体目录下的子文件或子目录

3>清空终端屏幕
(1)clear
(2)control + l

4>切换目录
cd:change directory:改变工作路径
cd +具体路径:切换到具体路径下面
cd:切换到用户主目录下
cd .:点代表当前路径
cd ..:点点代表当前目录的上一层目录
cd :代表用户主目录/home/xx用户
cd -:代表回到上一次操作的目录

5>Tab键使用
补全当前系统下已有的shell命令,补全文件名

6>新建目录
mkdir:make directory:创建目录
mkdir +文件名:在当前工作路径下创建目录文件
mkdir -p 1010/1009:创建1010目录的同时创建1009目录

7>删除目录
rmdir:remove directory:删除目录
rmdir +目录名:删除空目录,不能删除非空目录
rm -r +目录名:删除非空目录

8>创建文件
touch:创建普通文件
touch + 文件名:在当前目录下创建普通文件

9>删除文件
rm +文件名:在当前目录下删除对应的文件

10>拷贝文件
cp:copy拷贝文件
cp 要拷贝的文件 拷贝到哪个目录下

11>移动或者是重名命
mv:move移动文件
mv 要移动的文件 移动到哪个目录下
mv 要修改的文件 新的文件名

12>查看文件内容不需要打开文件
cat 文件名

13>
sudo apt-get install xxx包 安装相关软件
sudo apt-get update 更新数据源
sudo apt-get remove xxx包 卸载相关软件

14>文件权限修改

  • rw- r-- r--
    分析:
    (1)第一个字母决定文件是什么文件
    -:代表普通文件
    d:代表是目录文件
    (2)第二个字母~第四个字母,决定文件属主用户对其文件执行的权限rwx;
    r:可读
    w:可写
    x:可执行
    (3)第五个字母~第七个字母,决定与属主用户同组的其他用户执行的权限
    (4)最后几个字母,决定与属主用户不同组的其他用户执行的权限

(5)chmod使用
chmod 744 1.sh
chmod u+x 1.sh
chmod u+x,g+w,o+w 1.sh

u:user代表属主用户
g:group同组的其他用户
o:other不同组的用户
a:all代表所有人,不写默认为a

+:代表加某个权限
-:代表减掉某个权限

6.vi
1>是什么
vi是一个文本编辑器
vim是vi的升级版本

2>怎么安装
sudo apt-get install vim
如果遇到?E:no package...问题,解决之道
sudo apt-get update

3>vim使用
(1)打开文件
vim 1.sh
(2)插入数据
按下i键,等待左下角出现insert字样时,开始写数据
(3)保存
按下ESC键,进入一个非可编辑模式,shift+:;输入w表示保存;
(4)退出
按下ESC键,进入一个非可编辑模式,shift+:;输入q表示退出;

4>退出的方式
注意点:一定要在非可编辑模式下进行操作
(1):w保存
(2):q退出
(3):wq保存并退出
(4):q!不保存退出
(5):wq!忽略之前保存的内容

5>vim快捷键
注意点:一定要在非可编辑模式下进行操作
u:撤销上一次的操作
dd:删除光标所在的一行
yy:复制光标所在的一行
p:粘贴到光标所在行的下一行
2 dd:删除从光标起数两行
2 yy:复制从光标起数两行

如果要删除/复制多行,在非可编辑模式下进行操作,按下shift+v进入可视化模式,上下键选择要删除/复制的部分,按d/y键;

6>vim简单配置
cd /etc/vim
sudo vim vimrc

来到最下面按i键进入插入模式
set mouse=a 鼠标选中
set nu 显示行号
syntax on 语法高亮
set autoindent 自动缩进
set tabstop=4 缩进tab键字符宽度
进行保存退出

7.gedit
1>是什么
gedit是一个文本编辑器

8.shell脚本执行
1>chmod +x xx.sh
./xx.sh
2>sh xx.sh
注意点:最好使用第一种

9.注释

:代表注释单行

10.shell脚本的特点
1>shell脚本是一个弱类型的语言,不需要指定数据类型
2>如果变量没有定义,那么这个变量默认为空
3>如果shell脚本文件某一行出错,不会影响我整个程序的运行

11.标识符的命名规范
硬性规范
1>不能数字开头,
2>只能由字母,下划线,数字构成
3>不能与shell脚本的关键字相同if printf echo case等
建议:
1>不准用拼音,多查字典
2>建议使用驼峰命名规范numOfStudent
3>见名知义

12.变量
1>变量的定义
变量=值
注意点:
(1)变量一定义出来,就必须给他一个值,否则语法错误
(2)=号左右两边不能有空格
(3)如果右边是字符串,用""括起来

2>变量的使用
(1)以$符号开头
(2)加{},不是(),为了分清变量

3>变量的删除
(1)unset:删除变量,不需要加$,
(2)变量删除之后,这个变量默认为空

4>只读变量
(1)readonly value=7,表明这个变量将来不能被重新赋值
(2)readonly修饰的变量不能被unset删除

13.echo用法
echo:表示输出命令,输出echo后面的内容,会自动换行
1>echo后面是否加"",'',不加
(1)加''
''里面写什么输出什么
value="hello"
echo '$value'
输出结果是$value
(2)不加
降低程序的可读性
(3)加""
能避免上面两个缺点

2>shell转义字符
\n:代表换行
\t:相当于敲了一个tab键的宽度
\c:不换行,关闭echo命令本身换行的功能

3>echo -e开启转义
(1)如果是./xx.sh运行shell脚本,必须开启转义
value="hello"
echo "$value\n"是不会换行的

开启转义对特殊字符进行处理
echo -e "${value}\n"

(2)如果是sh xx.sh运行shell脚本,不需要开启转义
value="hello"
echo "$value\n"是会换行的

14.字符串相关处理方法
1>计算字符串长度
value="hello"
length=${#value}
echo "${length}"

2>字符串拼接
value1="hello"
value2="world"
value3="${value1} ${value2}"
echo "${value3}"

3>字符串截取
value1="hello world"
value2=${value1:6:5} #字符串是从0开始,从字符串哪个位置截取,截取的长度
echo "${value2}"

15.printf
value=“hello”
printf “value=%s\n” “${value}”
1>用法:printf是输出“”里面的内容,
%s:是一个占位符,严格意义上来说是输出字符串类型的,
%f:是一个占位符,后面必须是小数类型的数值占位
%d:是一个占位符,后面必须是整数类型的数值占位
%c:是一个占位符,后面必须是字符类型的数值占位
\n:转义字符

2>如果想用printf同时输出多个变量的值
value="hello"
value1=8
printf "value=%s\nvalue1=%d\n" "${value}" "${value1}"

3>
%.3f:表明小数点后面保留3位
%6.3f:6表明整个数据所占宽度为6个字符,如果不够,在左边以空格补全
%m.nf:右对齐
(1)如果m<=n+1+整数实际所占个数,m无效
(2)如果m>n+1+整数实际所占个数,m才会出现一定的效果

%-m.nf:左对齐

%md:
%ms:
%mc:

16.read
printf "请输入一个值:"
read value
printf "这个值=%s\n" "${value}"
1>用法:从键盘读入一个值,赋给read后面的变量
2>注意:read尽量不要使用同时输入多个值,比如read value1 value2

17.运算符
1>算数运算+ - \* / %
注意点:
(1)expr是计算整数类型的数据
(2)运算符左右两边都必须要有空格
(3)和$()都是取结果集 (4)注意乘法*必须要通过\\转义,不然会出错 (5)和$()不但可以取整数运算的结果集,还可以取shell命令的结果集,比如:result=ls
(6)result=expr $num1 % $num2求num1/num2=商。。。余数(result)

案例:
num1=1
num2=2
num3=expr $num1 \\* $num2
echo "${num3}"

2>整数之间的关系运算符
\> \< \>= \<= != ==
-gt -ge -lt -le -eq -ne

(1)在关系运算符中,运算的结果是一个逻辑值。如果关系表达式成立,逻辑值为1;否则为0
(2)>,<,>=,<=都必须要用\进行转义
(3)!=可以用\进行转义,也可以不用\转义(根据编译器决定)
(4)\=,=,\==,==(根据编译器决定)macOs支持=,\=

注意:整数运算可以用$(())
比如:
1 num1=1
2 num2=2
3 num3=$((num1+num2))
4 echo "${num3}"

3>字符串运算符
=:判断字符串是否相等
!=:判断字符串是否不相等
-z:zero,判断字符串是否为空(没有字符)或者是不存在或者字符串都是空格

案例:
1 string1="hello"
2 string2="hello"
3 if [ $string1 != $string2 ]
4 then
5 echo "not equal"
6 else
7 echo "equal"
8 fi

4>文件运算符
-d:表示判断是否是目录文件
-f:表示判断是否是普通文件
-r:判断文件是否可读
-w:判读文件是否可写
-x:判断文件是否可执行
-e:exist,判断文件是否存在

案例:
1 file="1.sh"
2 if [ -d $file ]
3 then
4 echo "目录文件"
5 else
6 echo "不是目录文件"
7 fi

案例:
1 file="11"
2 if [ -f $file ]
3 then
4 echo "普通文件"
5 else
6 echo "不是普通文件"
7 fi

案例:
1 file="1.sh"
2 if [ -e $file ]
3 then
4 echo "存在"
5 else
6 echo "不存在"
7 fi

/*
伪代码(能体现解题思路)
练习1:
~:/home/ccj
判断~/share目录文件是否存在,如果不存在就创建这个文件;如果存在,提示文件已存在的信息
1 file="/Users/ccj/share"
2 if [ -e $file ]
3 then
4 echo "我在"
5 else
6 mkdir $file
7 fi

*/

5>逻辑运算符
&&:并且 if [[ expr $num % 5 == 0 && expr $num % 3 == 0 ]]
||:或者
!:非

-a:and:并且 if [ expr $num % 5 == 0 -a expr $num % 3 == 0 ]
-o:or:或者 if [ expr $num % 5 == 0 -o expr $num % 3 == 0 ]

案例:
1 echo "请输入一个数:"
2 read num
3 if [ expr $num % 5 == 0 ] && [ expr $num % 3 == 0 ]
4 then
5 echo "这是3,5的倍数"
6 else
7 echo "不是3,5倍数"
8 fi

案例:
1 echo "请输入一个数:"
2 read num
3 if [ ! $num -gt 8 ]
4 then
5 echo "<=8"
6 else
7 echo ">8"
8 fi

用法:
事件1&&事件2:事件1成立并且事件2成立,整个事件才成立,否则整个事件不成立
事件1||事件2:两个事件只要有一个事件成立,整个事件就成立。

/*
练习:求输入的年份是否是闰年?,如果是闰年给出相应的提示
(1)4整除,且不被100整除
(2)400整除
条件1或者条件2

1 echo "请输入年份:"
2 read year
3 if [[ expr $year % 4 == 0 && expr $year % 100 != 0 ]] || [ expr $year % 400 == 0 ]
4 then
5 echo "闰年"
6 else
7 echo "不是闰年"
8 fi
*/

18.let关键字
num1=1
num2=2
let num3=num1+num2
echo “${num3}”
1>用在哪些运算符
算数运算符:+ - * / % ++ —
赋值运算符:+= -= *= /= %=
关系运算符:== !=

(1)后缀++
num1=1
let num3=num1++ #num3=num1,num1=num1+1
echo "num3=${num3}"
echo "num1=${num1}"
(2)前缀++
num1=1
let num3=++num1

num1=num1+1,num3=num1

echo "num3=${num3}"
echo "num1=${num1}"
(3)后缀—
num1=1
let num3=num1—

num3=num1,num1=num1-1

echo "num3=${num3}"
echo "num1=${num1}"
(4)前缀—
num1=1
let num3=—num1

num1=num1-1,num3=num1

echo "num3=${num3}"
echo "num1=${num1}"
(5)+=
num1=4
num2=2
let num1+=num2 #num1=num1+num2
echo "${num1}"

19.条件语句
1>语法格式
if []
then
语句体
fi
注意点:
(1)[]左右两边都要有空格
(2)关系运算符用-gt...表示

案例:
printf "请输入一个数:"
read num
if [ $num -gt 5 ]
then
echo "${num}"
fi

-gt:>
-ge:>=
-lt:<
-le:<=
-eq:==
-ne:!=

字母含义:
g:greater
t:than
e:equal
l:less
n:not

2>
if []
then
语句体1
elif []
then
语句体2
fi

案例:
printf "请输入一个数:"
read num
if [ $num -gt 5 ]
then
echo "${num}"
elif [ $num -le 5 ]
then
echo "这个数小于5"
fi

3>
if []
then
语句1
elif []
then
语句2
else
语句3
fi

4>总结if语句:
(1)else可以没有,如果有else,必须放在最后面,else下是没有then
(2)elif可以没有,必须要放在if else的中间任何位置
(3)if语句只能执行一个分支
(4)if的结束标志fi

/*
练习1:
输入两个整数,求其最大值
1 echo "请输入两个值"
2 read num1
3 read num2
4 if [ $num1 -gt $num2 ]
5 then
6 echo "max=${num1}"
7 else
8 echo "max=${num2}"
9 fi

*/

20.case
case 变量 in
值1)
语句体
;;
值2)
语句体
;;
esac

案例:
1 echo "请输入一个值:"
2 read num
3 case $num in
4 1)
5 echo "是1"
6 ;;
7 2)
8 echo "是2"
9 ;;
10 *)
11 echo "其他"
12 ;;
13 esac

注意点:
(1)结束标志必须是esac
(2)值1)和值2)可以相同
(3)如果值1)和值2)条件都不满足,这时会来到)
(4)
)你可以不写,但是如果要写就写在最后
(5)每一个分支结束之后都有一个;;

/*
练习1:
输入两个整数,再输入一个+ - * /运算符,根据运算符,来计算两个数运算的结果,使用case语句完成
1 printf "请输入两个数:"
2 read num1
3 read num2
4 printf "请输入一个运算符:"
5 read op
6 case $op in
7 "+")
8 printf "%d+%d=%d\n" "${num1}" "${num2}" "$((num1+num2))"
9 ;;
10 "-")
11 printf "%d-%d=%d\n" "${num1}" "${num2}" "$((num1-num2))"
12 ;;
13 "")
14 printf "%d
%d=%d\n" "${num1}" "${num2}" "$((num1*num2))"
15 ;;
16 "/")
17 printf "%d/%d=%d\n" "${num1}" "${num2}" "$((num1/num2))"
18 ;;
19 *)
20 printf "其他字符\n"
21 ;;
22 esac

*/

21.数组
1>数组初始化
(1)一个变量一个变量进行初始化
array1[0]=8
array1[1]=9
注意点:一个一个变量进行初始化,可以间隔赋值,还可以不从位置0开始。比如:
array[1]=7
array[5]=8

(2)整体数组赋值
array=(1 2 3 4 hello)

2>数组元素访问
${数组名[下标]}

3>遍历数组里面所有的元素
${数组名[*]}
${数组名[@]}

22.while循环
while []
do
语句体
done

案例:
1 sum=0
2 i=1
3 while [ $i -le 100 ]
4 do
5 let sum=sum+i
6 let i++
7 done
8 echo "sum=${sum}"

/*
练习1:
求1~100偶数和
1 sum=0
2 i=1
3 while [ $i -le 100 ]
4 do
5 if [ expr $i % 2 -eq 0 ]
6 then
7 let sum=sum+i
8 fi
9 let i++
10 done
11 echo "sum=${sum}"
12 echo "i=${i}"

练习2:
打印9X9乘法表
1X1=1
1X2=2 2X2=4
….
1X9=9 2X9=18 ….9X9=81
找规律:
1行1
2行2
n行n

1 row=1
2 colum=1
3 while [ $row -le 9 ]
4 do
5 colum=1
6 while [ $colum -le $row ]
7 do
8 let value=colum*row
9 printf "%dX%d=%02d " "$colum" "$row" "$value"
10 let colum++
11 done
12 printf "\n"
13 let row++
14 done

练习3:
打印




/
row=1
while [ $row -le 4 ]
do
space=1
while [ $space -le $((4-row)) ]
do
printf " "
let space++
done
star=1
while [ $star -le $((2
row-1)) ]
do
printf "*"
let star++
done
let row++
printf "\n"
done

23.shell参数
./xx.sh
$0:代表执行的文件./xx.sh
$1:代表执行的第一个参数
$2:代表执行的第二个参数
。。
$n:代表执行的第二个参数
$#:代表执行的参数个数,不包括命令本身

/*
练习:
写一个shell命令可以实现sh的功能
思路:
0.判断是否有参数,参数是否为1
1.判断文件是否存在
2.如果存在,判断文件是否是普通文件
3.改权限
4.运行
5.让这个命令在全局有效
chmod +x mysh
sudo cp mysh /bin/
*/

if [ $# -eq 0 ]
then
echo "do what?"
elif [ $# -eq 1 ]
then
if [ -e $1 ]
then
if [ -f $1 ]
then
chmod +x $1
./$1
else
echo "$1 is not file"
fi
else
echo "$1:No such file or directory"
fi
else
echo "too much arguments"
fi

24.for循环
1>格式
for 变量 in 参数列表
do
语句体
done

2>用法解释:
参数列表为变量一次一次的赋值

案例:
2 for value in 1 2 3 4 5
3 do
4 echo "==${value}=="
5
6 done

案例:
1 value=ls
2 for file in $value
3 do
4
5 echo "===${file}==="
6
7 done

25.break
break:是跳出整个循环

案例:
1 i=1
2 sum=0
3 while [ $i -le 100 ]
4 do
5 if [ $sum -gt 55 ]
6 then
7 break
8 fi
9 let sum+=i
10 let i++
11
12 done
13 echo "sum=${sum}"
14 echo "i=${i}"

分析:
当i=11,sum > 55,sum=55
sum=sum+i,sum=55+11,i=12

用法:
(1)当碰到break时,直接跳出循环,break下面的语句不会被执行
(2)break只跳出最近的一层循环
(3)break只能用在循环中

26.continue
/*
1~20和,跳过所有个位为3的数
*/
案例:
1 i=1
2 sum=0
3 while [ $i -le 10 ]
4 do
5 if [ expr $i % 10 == 3 ]
6 then
7 let i++
8 continue
9 fi
10 let sum+=i
11 let i++
12
13 done
14 echo "sum=${sum}"

分析:
i=3时,if条件成立,执行continue,那么continue以下的语句就不会被执行,继续返回到while判断的语句看条件是否成立,如果成立继续执行

用法:
(1)当碰到continue时,跳出本层循环的当前一次循环,continue以下面的语句不会被执行
(2)continue只能用在循环中

27.死循环
while :
do
语句体
done

28.shell函数
1>什么时候用到函数?
(1)执行的功能类似
(2)根据实际需求

2>shell函数定义格式
function 函数名()
{

}

3>调用shell函数
函数名

4>函数参数传递
案例:
./xx.sh q w e
1 function test()
2 {
3 echo "$0"
4 echo "$1"
5 echo "$2"
6 echo "${10}"
7 echo "hello wo"
8 }
9 test 1 2 3 4 5 6 7 8 9 34
10 echo "$0"
11 echo "$1”
12 echo "$2”
分析:
(1)当参数作为shell函数参数传递时,当在函数里面接收n>=10个参数时,要加上${n};
(2)$0不是test,而是shell文件本身
(3)函数里面的$1与函数外面的$1不相同,但是函数里面的$0与函数外面的$0相同

5>函数返回值
案例:
1 sum()
2 {
3 num1=$1
4 num2=$2
5 let value=num1+num2
6 return $value
7 }
8 sum 1 2
9 echo "sum=$?"
10 sum 2 3
11 echo "sum=$?"
分析:
(1)函数如果是return出来的结果,我们用$?接收,$?是接收最后运行的一次脚本函数,
(2)如果return后面的值value>255,那么函数运行完之后用$?接收,$?=value%256
(3)怎么接收return出来的值比255大?解决之道:使用echo返回出来,函数外使用变量接收value=函数名,从而对value进行操作
(4)实际上echo是临时保存函数的结果集

案例:
1 test()
2 {
3 echo "hello world"
4 }
5
6 value=test
7 echo "test函数的返回值${value}"

6>函数里面可以嵌套函数的定义
a()
{
b()
{

}
}
分析:函数b在什么情况下会被调用?
先要调用a,因为a中有函数b的实现

7>条件函数
a()
{
if []
then
b()
{
echo “===b===”
}
else
c()
{
echo “===c===”
}

}

分析:函数b和函数c在什么情况下可以调用?
先运行函数a,应为a中有函数b和c的实现
在if语句条件成立时,实现函数b的定义;
其他情况,实现函数c的定义

shell函数总结:
(0)函数调用之前必须要有相应的函数定义
(1)function关键字可写可不写
(2)shell函数可以有return,也可以没有return
(3)如果是return出来的结果必须要用$?接收
(4)如果是echo保存的结果集,必须要用value=test取结果集接收

/*
1.自动产生当天的文件夹,供每天写代码使用
file=date +%Y/%m%d
echo "${file}"

~/practice/2016/10/1012
思路:
1>判断参数个数
xx.sh
xx.sh -y
xx.sh -m
xx.sh -d

2>
0:-d
1:

1:提示错误

3>如果参数是一个
-y
-m
-d

year=date +%Y
month=date +%m
day=date +%m%d
if [ $# -eq 0 ]
then
if [ -e ~/practice/$year/$month/$day ]
then
echo "${day}文件已存在"
else
mkdir -p ~/practice/$year/$month/$day
fi
cd ~/practice/$year/$month/$day
elif [ $# -eq 1 ]
then
case $1 in
"-y")
if [ -e ~/practice/$year ]
then
echo "${year}文件已存在"
else
mkdir -p ~/practice/$year

fi
cd ~/practice/$year
;;
"-m")
if [ -e ~/practice/$year/$month ]
then
echo "${month}文件已存在"
else
mkdir -p ~/practice/$year/$month
fi
cd ~/practice/$year/$month
;;
"-d")
if [ -e ~/practice/$year/$month/$day ]
then
echo "${day}文件已存在"
else
mkdir -p ~/practice/$year/$month/$day
fi
cd ~/practice/$year/$month/$day
;;
*)
printf "参数?"
printf "用法[-y] [-m] [-d]\n"
;;
esac
else
echo "参数过多"
fi

2.万年历
输入查询年份2016,再输入查询月份9
1>1990.1.1星期一
2>查询范围1990.1.1之后查询
3>闰年判断条件(year%4==0&&year%100!=0)||(year%400==0)
思路:计算1990.1.1~2016.8.31所有的天数
十月 2016
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

1>输入方式:
(1)mycal 默认的当月月历
(2)mycal 2016 整个年份
(3)mycal 2016 10

1.判断输入的参数的个数
0:
1:以后开发
2:
写一个函数

2.具体考虑
0:year=date +%Y month=date +%m
2:year=$1 month=$2

3.考虑计算实际天数
1990.1.1~2016.10.1

(1)是算1990.1.1~2015.12.31
(2)2016.1.1~2016.9.30

calWhat()
{
year=$1
month=$2
if [ $year -lt 1990 ] || [ $month -lt 1 ] || [ $month -gt 12 ]
then
echo "时间不符..."
else
i=1990
allDay=0
array=(0 31 28 31 30 31 30 31 31 30 31 30 31)
while [ $i -lt $year ]
do
if [ expr $i % 4 == 0 -a expr $i % 100 != 0 ] || [ expr $i % 400 == 0 ]
then
let allDay+=366
else
let allDay+=365
fi
let i++
done
if [ expr $year % 4 == 0 -a expr $year % 100 != 0 ] || [ expr $year % 400 == 0 ]
then
array[2]=29
else
array[2]=28
fi
i=1
while [ $i -lt $month ]
do
let allDay+=array[i]
let i++
done
let week=allDay%7
let week=(week+1)%7 #当月的第一天
echo -e "\t\t\t${year}/${month}"
echo -e "日\t一\t二\t三\t四\t五\t六"
colum=0
i=1
while [ $i -le $week ]
do
printf " \t"
let i++
let colum++
done
i=1
while [ $i -le ${array[$month]} ]
do
printf "${i}\t"
let colum++
if [ expr $colum % 7 == 0 ]
then
printf "\n"
fi
let i++
done
printf "\n"
fi

}

if [ $# -eq 0 ]
then
argument1=date +%Y
argument2=date +%m
calWhat ${argument1} ${argument2}
elif [ $# -eq 1 ]
then
echo "尽情期待..."
elif [ $# -eq 2 ]
then
argument1=$1
argument2=$2
calWhat ${argument1} ${argument2}
else
echo "参数错误"
fi

*/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • shell脚本语句 运算符符 运算符的使用+ - * /1. expr是计算整数类型行的数据2. 运算符左右都要有...
    I踏雪寻梅阅读 330评论 0 2
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,525评论 0 11
  • 1.echo echo -n 不换行输出echo -e 处理特殊字符 2.$( ) 与 (反引号) 都是用来做命...
    lmem阅读 434评论 0 0
  • 什么是linux linux可以为我们做什么 打游戏下软件听音乐 系统服务器 连接Internet 网络使用lin...
    帅碧阅读 947评论 1 6
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,148评论 2 25