我想构建一个shell脚本来自动将目标文件存档到静态库中,并将所有头文件和.a文件复制到所需的目录。
然而,随着obj文件数量的增加,以下情况变得更糟:
8 CWD=$(pwd)
9
10 FILE1="SDL_Logger.o"
11 HEADER1="SDL_Logger.h"
12 FILE2="SDL_Initializer.o"
13 HEADER2="SDL_Logger.h"
14 ARC="libsdlhelper.a"
15
16 INCLUDE=~/include
17 LIB=~/lib
18
19 if [ ! -f $FILE1 ];
20 then
21 echo " error: file $FILE1 does not exist. Abort."
22 else
23 if [ ! -f $FILE2 ];
24 then
25 echo " error: file $FILE2 does not exist. Abort."
26 else
27 echo " building archive... "
28 ar rs $ARC $FILE1 $FILE2
29
31 # lib
32 cp $ARC $LIB
34
35 # include
36 cp $HEADER1 $INCLUDE
37 cp $HEADER2 $INCLUDE
39
41 fi
42 fi
所以,如果我将所有文件分组为一个变量,如:
FILE="obj1.o obj2.o ... "
我如何检查每个文件的存在,并复制它们(标题)?我只能逐一做到这一点,这很快就会被接受。
答案 0 :(得分:0)
这是我想出来帮助你的。 最好的方法是使用FILE数组
实现您要执行的操作的简短示例:
# !/bin/bash
#define an array of files to look for
FILES=("SDL_Logger.h" "SDL_Initializer.h" "libsdlhelpere.o")
#define your directories
INCLUDE=~/include
LIB=~/lib
#set the amount of entries in our array
SIZE=${#FILES[@]}
# use for loop read all FILES
for (( i=0; i<${SIZE}; i++ ));
do
echo "checking for file: "${FILES[$i]}
if [ ! -f ${FILES[$i]} ];
then
echo " error: file"${FILES[$i]}" does not exist. Abort."
else
echo " building archive... "
fi
done
这里我们将FILES定义为数组
FILES=("SDL_Logger.h" "SDL_Initializer.h" "libsdlhelpere.a")
然后我们找到文件的大小
SIZE=${#FILES[@]}
然后我们遍历每个文件并执行一个echo命令,然后执行if语句:
for (( i=0; i<${SIZE}; i++ ));
do
以下是我们如何调用数组中的项目...
${FILES[$i]}
所以我们用简单的英语做的是:
echo FILES[1]....
IF FILES[1] doesn't exist then error....
else execute building archive...
echo FILES[2]....
IF FILES[2] doesn't exist then error...
etc...
这将重复,直到满足文件大小。
使用此方法,您还可以定义文件名的开头部分,例如 “SDL_Initializer”并将你的循环添加到.o .h中。 .a等......也许是另一个数组FILETYPES;)
希望这有助于...... 对不起,我没有为您完成代码:)
答案 1 :(得分:0)
以下是对问题的回答:
#!/bin/bash
FILES="SDL_Logger.o SDL_Initializer.o"
HEADERS="${FILES//.o/.h}"
ARC="libsdlhelper.a"
INCLUDE=~/include
LIB=~/lib
for f in ${FILES}; do
if [ ! -f "${f}" ]; then
echo "error: file ${f} does not exist. Abort."
exit 1
fi
done
ar rs ${ARC} ${FILES}
cp ${ARC} ${LIB}
cp ${HEADERS} ${INCLUDE}
然而,正如评论所指出的,这项工作的正确工具是make。例如GNU make。如果您打算在unix平台上开发软件,那么投入时间学习就可以节省时间。