Linux开发_Makefile规则与Shell脚本语言

135 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

介绍交叉编译器静态库、动态库的编译方式;介绍Makefile规则、语法;介绍Shell脚本常见语法、Shell脚本常见练习题等等。

任务1:静态库与动态库

交叉编译--动态编译与静态编译方式:

 [root@wbyq test]# arm-linux-gcc 123.c -o app_1 
 ​
 [root@wbyq test]# arm-linux-gcc -static 123.c -o app_2

Linux下库文件存放的位置:/lib (存放的是动态库)

.so属于动态库 : .a属于静态库

动态库称为共享库:gcc 123.c -o app

共享库:程序在运行的时候去调用函数(载入函数)。

静态库:相关的函数在编译的时候就已经拷贝到目标中。

任务2:Makefile

Makefile :用于编写程序的编译规则。 make命令用于执行Makefile文件。

make常用的选项参数:

 -n :  输出命令的执行过程,不执行名称
 ​
 -s :  隐藏命令本身。 在命令前面加上@符号,可以隐藏命令本身。
 ​
 $(shell pwd)
 ​
 CC :  特殊变量,用于存放编译器。

练习:

【1】Makefile自动化编译

只是创建3个目录,每个目录下各有一个.c一个.h

在顶层目录下创建一个Makefile文件,实现自动化编译。

 CC=gcc
 VPATH=./abc
 app:print.o main.o sum.o
     $(CC) $^ -o $@
 %.o:%.c
     $(CC) $< -o $@ -c
 clean:
     rm ./*.o app -rf

【2】Makefile自动化编译

需要创建3个目录,每个目录下各有一个.c一个.h,一个Makefile文件

在顶层目录下创建一个Makefile文件,实现自动化编译。

特殊符号:

冒号用法: <目标文件>:<依赖文件1> <依赖文件2> ….

 OBJECT=main.o print.o sum.o
 CC=gcc
 VPATH=main:sum:print
 CFLAGS=-Imain -Isum -Iprint
 app:$(OBJECT)
     $(CC) $^ -o $@

include 关键字

用法: include <路径或者具体的文件>

任务3:Shell脚本语言

Linux下常用的脚本语言。

【1】变量、数组、for、while、函数、运算符、if、……..

 [root@wbyq /]# ls /bin/sh -l
 ​
 lrwxrwxrwx. 1 root root 4 12月 27 2016 /bin/sh -> bash

【2】变量定义使用

 #!/bin/bash
 ​
 ABC=12345
 ​
 echo "ABC=$ABC"
 ​
 echo "ABC=${ABC}"

【3】Shell脚本传递参数 类似于C语言的argv argc

 ​
 #!/bin/bash
 ​
 echo "cnt=$#"
 ​
 echo "[0]=$0"
 ​
 echo "[1]=$1"
 ​
 echo "[2]=$2"
 ​
 echo "[3]=$3"

【4】if语句语法规则

 ​
 #!/bin/bash
 ​
 a=10
 ​
 b=20
 ​
 if [ $a -eq $b ]
 ​
 then
 ​
 echo "123"
 ​
 else
 ​
 echo "456"
 ​
 fi

【5】计算字符串长度

 ​
 #!/bin/bash
 ​
 string="abcd"
 ​
 echo ${#string} #输出 4

【6】数组语法

 #!/bin/bash
 ​
 buff=(1 2 3 4 5 6 7 8 9)
 ​
 buff[0]=88
 ​
 buff[1]=99
 ​
 buff[100]=100
 ​
 buff[88]=55
 ​
 echo "buff[0]=${buff[0]}"
 ​
 echo "buff[1]=${buff[1]}"
 ​
 echo "buff[2]=${buff[2]}"
 ​
 echo "buff[100]=${buff[100]}"

【7】echo用法示例

 #!/bin/bash
 ​
 DATA=12345
 ​
 echo "DATA=${DATA}"

【8】从键盘上读取数据

 #!/bin/bash
 ​
 echo -n "输入数据:" #参数-n 的作用是不换行, echo 默认是换行
 ​
 read data #从键盘输入
 ​
 echo "你输入的数据为: $data" #显示信息

【9】printf格式打印

 #!/bin/bash
 ​
 printf "%d\n" 1234
 ​
 printf "%s\n" "45678"

知识点总结:

 #!/bin/bash
 ​
 #if使用方式1
 if [ 1 -eq 2 -o 1 -lt 5 ]
 then
     echo "条件为真"
 else
     echo "条件为假"
 fi
 ​
 #if使用方式2
 if((1==2 || 1==1))
 then
     echo "条件为真"
 else
     echo "条件为假"
 fi
 ​
 #for循环的使用方式1
 for i in 1 2 3 4 5
 do
     echo "i=$i"
 done
 ​
 #for循环的使用方式2
 for((i=0;i<5;i++))
 do
     echo "i=$i"
 done
 ​
 ​
 #while循环的使用方式1
 i=0
 while [ $i -lt 5 ]
 do
     #i=`expr $i + 1`
     let i=i+1+34-4   #算术运算
     echo "i=$i"
 done
 ​
 ​
 #while循环的使用方式2
 i=10
 while((i<15))
 do
     ((i++))  
     echo "i=$i"
 done
 ​
 ​
 #数组当做函数的形参进行传递
 func()
 {
     echo ${buff[0]}
     echo ${buff[1]}
     echo ${buff[2]}
     echo ${buff[3]}
 }
 ​
 buff[0]=a
 buff[1]=b
 buff[2]=c
 buff[3]=d
 ​
 func ${buff[*]}  #数组的传递
 ​
 ​
 #获取命令的执行状态
 ​
 #方式1 (获取返回值)
 data=`ls -l` 
 echo "data1=$data"
 ​
 #方式2 (获取命令执行状态)
 ls -l
 echo "data2=$?"

Shell脚本练习:

【1】从键盘上输入年份,判断平年闰年。

 #!/bin/bash
 echo -n "输入一个年份:"  #参数-n 的作用是不换行, echo 默认是换行
 read year  #从键盘输入值存放到year中
 ​
 #判断闰年与平年
 if [ $(expr ${year} % 4) -eq 0 -a $(expr ${year} % 100) -ne 0 ] || [ $(expr ${year} % 400) -eq 0  ]
 then
 echo "${year} 是闰年"
 else
 echo "${year} 是平年"
 fi
 ​
 ​
 #说明: if语句里两个独立的表达式可以使用

【2】输出9*9乘法口诀表

 #!/bin/bash
 #输出9*9乘法口诀表
 i=1
 j=1
 while [ $i -le 9 ]  #le判断左边是否小于等于右边的
 do
     while [ $j -le $i ]
     do
         printf "%d*%d=%d " $i $j `expr $i '*' $j`
         j=`expr $j + 1`
     done
     printf "\n"
     j=1
     i=`expr $i + 1`
 done
 ​

【3】冒泡排序。

 #!/bin/bash
 echo -n "请输入排序数据的数量:" 
 read max_cnt
 ​
 echo -n "请输入数据(输入一个数据按下回车键)"
 ​
 cnt=0
 while [ $cnt -lt $max_cnt ]
 do
     read buff[$cnt]
     #((cnt++))
     cnt=`expr $cnt + 1`
 done
 echo "数组的数据=${buff[*]}"
 ​
 ​
 #实现冒泡排序
 max_cnt=`expr $max_cnt - 1`
 ​
 i=0
 j=0
 tmp=0
 while [ $i -lt $max_cnt ]
 do
     while [ $j -lt $max_cnt ]
     do
         if [ ${buff[$j]} -lt ${buff[`expr $j + 1`]} ]
         then
             tmp=${buff[$j]}
             buff[$j]=${buff[`expr $j + 1`]}
             buff[`expr $j + 1`]=$tmp
         fi
         j=`expr $j + 1`
     done
     j=0
     i=`expr $i + 1`
 done
 ​
 echo "排序之后的数据=${buff[*]}"