首页 > 代码库 > 第十天:shell编程基础与编写Makefile
第十天:shell编程基础与编写Makefile
一:shell编程基础
shell定义:shell是一个作为用户与linux系统间接口的程序。它允许用户向操作系统输入需要执行的命令.shell有很多中,linux系统中shell为bash。
shell编程可以看作是一堆命令的集合。和windows中的bat程序类似的脚本程序。为解释性语言。
第一个shell程序是判断两个数字的大小。
1 #!/bin/bash 2 3 num1=10 4 num2=9 5 6 if test $num1 -gt $num2 7 then 8 echo $num1 9 else 10 echo $num211 fi
由于是第一个程序,那么就逐行解释代码;第一行中的#!告诉系统紧跟在它后面的参数是用来执行文本文件的程序。
第三行和第四行定义两个变量num1和num2 并赋值,这里要注意的是,变量名和等号之间不能后空格。因为shell脚本程序中,空格是结束符号。 第六行 为判断语句 ,test 为测试,也可以用[ ] , -gt 相当与 > 号,(还有 lt 表示小于,ge表示>= le表示 < = eq 表示等于 ne表示不等于) $ 符号表示取变量的值。
if then fi 是判断语句的结构。 echo 输出 变量值
shell中的循环
1 #!/bin/bash2 3 for((i=0;i<=10;i++))4 #for i in 1 2 3 45 do 6 echo "hello world $i"7 done
1 #!/bin/bash2 3 sum=0;4 5 for i in `seq 1 100`6 do7 sum=`expr $sum + $i`8 done9 echo $sum
shell中的函数
1 #!/bin/bash2 3 hello()4 {5 echo "hello world `date`"6 7 8 }9 hello
1 #!/bin/bash2 3 function add {4 echo $[$1 + $2] 5 }6 result=`add 10 20`7 echo "result is $result"
$1 $2 表示函数的参数 。还是要主要空格的使用。上面代码中add 和{ 之间有空格。写的时候没有注意,找了好久。
目前所需要的shell知识就是看懂上述经典的shell就可以了。
老刘今天只是大概说了下shell ,主要是引出Makefile的编写。老刘编写了三个函数,main.c bunfly.c hello. c main函数中有使用到bunfly.c和hello.c中定义的函数。Makefile 函数从简单到复杂,不断的用变量来代替原先的值,这个过程我没有保存,所以只贴最后的代码:
1 CC=gcc -c 2 LD=gcc 3 RM=rm -rf 4 TARGET=test 5 OBJ=main.o bunfly.o hello.o 6 ${TARGET}:${OBJ} 7 ${LD} $^ -o $@ 8 %.o: %.c 9 ${CC} $^ -o $@10 #main.o: main.c11 # ${CC} $^ -o $@12 #bunfly.o: bunfly.c13 # ${CC} $^ -o $@14 #hello.o: hello.c15 # ${CC} $^ -o $@16 clean: 17 ${RM} ${OBJ} ${TARGET}
有几个重要的知识点,1.$@表示目标文件 2.$^表示所有依赖文件 3.$< 表示第一个依赖文件。 匹配模式%.o:%.c 可以使用make clean单独使用里面的clean
Makefile还有一个时间撮的概念,就是会根据文件更改时间判断是否执行某些代码 ,还有一点,以后有automake可以自动编写Makefile 。就是说Makefile 会写些,会看就行。
下午由于有篮球比赛,就讲了typedef 的使用 。看懂下面代码就行
1 #include<stdio.h> 2 3 typedef int int32; 4 typedef int (*pf)(int32 ,int32); 5 6 int32 ave(int32 a,int32 b ) 7 { 8 return ( a + b) / 2 ; 9 10 }11 int32 call(pf p,int32 a,int32 b )12 {13 return p(a,b);14 15 }16 int main()17 {18 int32 n = ave(10,20);19 printf("%d\n",n);20 21 pf p = ave;22 printf("%d\n",p(10,20)); 23 24 printf("%d\n",call(p,10,20));25 26 }
作业是复习递归的使用。两个函数,一个是用递归写atoi函数,一个是用递归实现十进制转二进制。
1 #include<stdio.h> 2 3 int n = 0; 4 5 int myatoi(char *p) 6 { 7 8 n = n*10 + (*p - 48 ); 9 if(*(p+1) == ‘\0‘)10 return;11 myatoi(++p); 12 return n;13 14 }15 int main()16 { 17 char arr[10] = {"2312345"};18 n = myatoi(arr);19 printf("%d\n",n);20 }
1 #include<stdio.h> 2 int dtox(int n) 3 { 4 if(n / 2 ==0) 5 { 6 printf("%d",n % 2); 7 return ; 8 } 9 dtox(n/2);10 printf("%d",n % 2);11 12 }13 int main()14 {15 int n = 10;16 dtox(n);17 }
第一个是看了别人的代码后写出来的,过几天再写一遍,第二个以前写过。这次写也发了些时间,不该。
第十天:shell编程基础与编写Makefile