2014-02-22 55 views
1

我想構建一個shell腳本來自動將目標文件歸檔到靜態庫中,並將所有的頭文件和.a文件複製到所需的目錄。如何在shell腳本中批處理文件?

然而,隨着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 ... " 

將如何我檢查每個文件的存在,並複製它們(標題)?我只能一個接一個地做,這很快就不能接受了。

+3

您可能更喜歡使用make,專爲此工作而設計的工具。 – bmargulies

+0

使用'for'循環有問題嗎?你知道他們嗎? – Barmar

+0

是的,Makefiles是要走的路。或者類似的構建系統,比如SCons,CMake,可能還有其他的。 – Carpetsmoker

回答

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=("SDL_Logger.h" "SDL_Initializer.h" "libsdlhelpere.a") 

然後我們找到文件大小

SIZE=${#FILES[@]} 

然後我們通過每個文件所以我們正在用簡單的英語做

for ((i=0; i<${SIZE}; i++)); 
do 

下面是我們如何調用數組在我們的項目...

${FILES[$i]} 

:和執行命令這是迴音,然後我們的if語句:

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... 

這將重複,直到文件的大小在met。

使用此方法,您也可以只定義文件名的起始部分,如 「SDL_Initializer」,並將循環添加到.o .h中。 .A等等......也許另一個陣列的文件類型;)

希望這有助於... 對不起,我沒有完成你的代碼:)

+0

非常感謝!相信與否我不知道殼中的循環,是的。 – Diaz

+0

你每天都會學到東西:)沒問題。很高興幫助 – user2815333

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平臺上開發軟件,那麼投入時間學習製作就足夠了。

+0

感謝您的解決方案運作良好:) – Diaz

相關問題