如何在shell脚本中批处理文件?

时间:2014-02-22 01:41:03

标签: bash shell makefile

我想构建一个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 ... "

我如何检查每个文件的存在,并复制它们(标题)?我只能逐一做到这一点,这很快就会被接受。

2 个答案:

答案 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平台上开发软件,那么投入时间学习就可以节省时间。