一、SHELL中的函数
1格式
function 函数名 ()
{
shell 语句
}
shell函数中任然遵循点定义后调用的规则,但是在shell中,函数的定义和声明不能分开,只能把函数定义在函数调用的上方、
shell函数中的变量
shell修饰变量
unset :清空变量----------------不能清空只读变量
readonly:只读变量
local:局部变量----------只能在函数中定义
2参数获取
通过位置变量获取参数
$ 1…$ n…$ 1------->9以上${10}
$#传参个数
$* $@ 所有参数
3返回值
return
echo
练习
<1>把计算数组元素封装成一个函数
#!/bin/bash
function grepsum()
{
sum=0
for i in ${arr[*]}
do
((sum+=i))
done
echo $sum
}
arr=(12 1 2 3 4 5)
grepsum ${arr[*]}
结果:
<2>输入用户的名字,判断该系统上是否存在该用户
(封装函数get_user_line(),若用户存在返回在/etc/passwd中的行号)
若存在该用户,将用户的gid和uid显示出来
(封装函数get_user_info),将上述函数返回的行号传递到这个函数中,返回uid和gid)
#!/bin/bash
read -p "输入用户的名字" name
function get_user_line()
{
user=`grep "^$name" /etc/passwd -n`
num=`echo $user | cut -d ":" -f 1`
if test -z $user
then
return "$name用户不存在"
else
echo "行号$num"
return $num
fi
}
get_user_line $1
a=$?
function get_user_info()
{
str=`head -$a /etc/passwd | tail -1 `
echo $str
uid=`echo $str | cut -d ":" -f 3`
gid=`echo $str | cut -d ":" -f 4`
echo "uid:$uid"
echo "gid:$gid"
}
结果:
Makefile
1makefile 是一个工程管理项目文件
2学习Makefile的前提
(1)编译过程
(2)变量基础
(3)目标和依赖思想
预处理 编译 汇编 链接
gcc -E .c -o .i
gcc -S .i -o .s
gcc -C .s -o .o
gcc .o -o exe
.i文件依赖于.c文件
3Makefile的语法
规则和依赖组成
变量
规则的构成
目标
依赖
命令
一个目标可以没有依赖,可以没有命令
一个目标也可以有多个依赖
一个规则必须有多个目标
Makefile把程序分为两步
源文件------汇编文件
汇编文件-----可执行文件
当文件发生修改,Make file会根据,文件的时间戳判断文件是否更新,再决定是否重新编译
all :hello
hello:main.o hello.o
gcc main.o hello.o -o hello
main.o:mainc
gcc -c main.c -o main.o
hello.o:hello.c
gcc -c hello.c -o hello.o
4Makefile 中的变量
可以理解为宏定义
${变量名}
(1)自动变量---------(在规则范围内的)
$^--------------------所有依赖
$@------------------所有目标
$<--------------------第一个依赖
(2)赋值
=:延迟赋值
+=:追加赋值
:=:直接赋值
?=:条件赋值----------------如果变量前面有值就不赋值
5Make file通配符
%---------------目标和依赖之间的唯一匹配
6最终版的makefile
CC = gcc
EXE = hello
OBJS += main.o
OBJS += hello.o
all:${EXE}
${ExE}:${OBJS}
${CC} $^ -o $@
%.o:%.c
${CC} -c $^ -o $@
clean:
rm *.c ${EXE}