2012-03-03 87 views
1

我需要通過bash腳本將3行添加到文件中; sedawk不是也不能安裝。我有以下腳本插入行,但通過bash vertue所有格式在文件中丟失。我懷疑它以其他方式修改文件,以及在嘗試使用生成的修改後的文件進行編譯時出現其他錯誤。如何在使用bash時保留所有格式(空格)?

c=0 
while read line 
do 
if [ "$c" -eq 99 ]; then 
    echo -e "// Added by build.sh\n#define PROGMEM\n#define prog_char\n\n$line" 
else 
    echo "$line" 
fi 
((c=c+1)) 
done <libdefs.h>> libdefs.h.new 

更新腳本:

這將保留格式,並增加了線,但不知何故,軋液的文件。如果我手動添加3行並編譯它的工作,如果我使用腳本,我會得到各種錯誤。

c=0 
while IFS= read line 
do 
if [ "$c" -eq 99 ]; then 
    echo "// Added by build.sh" 
    echo "#define PROGMEM" 
    echo "#define prog_char" 
    echo "" 
fi 
echo "$line" 
((c=c+1)) 
done <libdefs.h>> libdefs.h.new 

第一個是libdefs.h:363:2: error: expected identifier or '(' before numeric constant。所以它看起來像parens正在混淆。

DIFF:

--- libdefs.h.old 2011-10-01 13:46:34.000000000 -1000 
+++ libdefs.h 2012-03-02 22:00:16.000000000 -1000 
@@ -97,6 +97,10 @@ 
    #include <avr/interrupt.h> 
#endif 

+// Added by build.sh 
+#define PROGMEM 
+#define prog_char 
+ 
// create a type for boolean 
typedef int8_t boolean; 

@@ -351,35 +355,35 @@ 
typedef uint16_t TIMER_MODES; 

// The set of PWM modes 
-#define PWM_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_PWM8_PHASE_CORRECT) | \ 
- BV(TIMER_MODE_PWM9_PHASE_CORRECT) | \ 
- BV(TIMER_MODE_PWM10_PHASE_CORRECT) | \ 
- BV(TIMER_MODE_PWM8_FAST) | \ 
- BV(TIMER_MODE_PWM9_FAST) | \ 
- BV(TIMER_MODE_PWM10_FAST) | \ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | \ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | \ 
- BV(TIMER_MODE_PWM_FAST_ICR) | \ 
- BV(TIMER_MODE_PWM_FAST_OCR) \ 
+#define PWM_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_PWM8_PHASE_CORRECT) | 
+ BV(TIMER_MODE_PWM9_PHASE_CORRECT) | 
+ BV(TIMER_MODE_PWM10_PHASE_CORRECT) | 
+ BV(TIMER_MODE_PWM8_FAST) | 
+ BV(TIMER_MODE_PWM9_FAST) | 
+ BV(TIMER_MODE_PWM10_FAST) | 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | 
+ BV(TIMER_MODE_PWM_FAST_ICR) | 
+ BV(TIMER_MODE_PWM_FAST_OCR) 
)) 

// The set of ICR modes 
-#define ICR_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | \ 
- BV(TIMER_MODE_CTC_ICR) | \ 
- BV(TIMER_MODE_PWM_FAST_ICR) \ 
+#define ICR_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | 
+ BV(TIMER_MODE_CTC_ICR) | 
+ BV(TIMER_MODE_PWM_FAST_ICR) 
)) 

// The set of OCR modes 
-#define OCR_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_CTC_OCR) | \ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | \ 
- BV(TIMER_MODE_PWM_FAST_OCR) \ 
+#define OCR_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_CTC_OCR) | 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | 
+ BV(TIMER_MODE_PWM_FAST_OCR) 
)) 

#define modeIsPWM(mode) (((TIMER_MODES)(BV(mode))) & PWM_MODES) 
@@ -389,29 +393,29 @@ 
#define TIMER_NO_MODES 0 

// Define bits if all modes are supported 
-#define TIMER_ALL_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_NORMAL)|\ 
- BV(TIMER_MODE_PWM8_PHASE_CORRECT)|\ 
- BV(TIMER_MODE_PWM9_PHASE_CORRECT)|\ 
- BV(TIMER_MODE_PWM10_PHASE_CORRECT)|\ 
- BV(TIMER_MODE_CTC_OCR)|\ 
- BV(TIMER_MODE_PWM8_FAST)|\ 
- BV(TIMER_MODE_PWM9_FAST)|\ 
- BV(TIMER_MODE_PWM10_FAST)|\ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_ICR)|\ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_OCR)|\ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR)|\ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR)|\ 
- BV(TIMER_MODE_CTC_ICR)|\ 
- BV(TIMER_MODE_PWM_FAST_ICR)|\ 
- BV(TIMER_MODE_PWM_FAST_OCR)\ 
+#define TIMER_ALL_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_NORMAL)| 
+ BV(TIMER_MODE_PWM8_PHASE_CORRECT)| 
+ BV(TIMER_MODE_PWM9_PHASE_CORRECT)| 
+ BV(TIMER_MODE_PWM10_PHASE_CORRECT)| 
+ BV(TIMER_MODE_CTC_OCR)| 
+ BV(TIMER_MODE_PWM8_FAST)| 
+ BV(TIMER_MODE_PWM9_FAST)| 
+ BV(TIMER_MODE_PWM10_FAST)| 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_ICR)| 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_OCR)| 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR)| 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR)| 
+ BV(TIMER_MODE_CTC_ICR)| 
+ BV(TIMER_MODE_PWM_FAST_ICR)| 
+ BV(TIMER_MODE_PWM_FAST_OCR) 
)) 

// Define bits for less capable timers 
-#define TIMER_3BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| \ 
+#define TIMER_3BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| 
     BV(TIMER_MODE_PWM8_FAST)|BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR)|BV(TIMER_MODE_PWM_FAST_OCR)) 

-#define TIMER_2BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| \ 
+#define TIMER_2BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| 
     BV(TIMER_MODE_PWM8_FAST)) 


@@ -444,11 +448,11 @@ 


#define MAKE_TIMER_COMPARE_DATA() {0,null/*,0*/} 
-#define MAKE_TIMER_COMPARE(data,timer,port,mask,threshold, intport,intmask, comport,combit,pwm) \ 
- {&data,timer, {_SFR_MEM_ADDR(port),BV(mask)},_SFR_MEM_ADDR(threshold), \ 
- {_SFR_MEM_ADDR(intport),BV(intmask)}, \ 
- {_SFR_MEM_ADDR(comport),combit}, \ 
- pwm \ 
+#define MAKE_TIMER_COMPARE(data,timer,port,mask,threshold, intport,intmask, comport,combit,pwm) 
+ {&data,timer, {_SFR_MEM_ADDR(port),BV(mask)},_SFR_MEM_ADDR(threshold), 
+ {_SFR_MEM_ADDR(intport),BV(intmask)}, 
+ {_SFR_MEM_ADDR(comport),combit}, 
+ pwm 
    } 

/** 
@@ -493,27 +497,27 @@ 
} TimerData; 

#define MAKE_TIMER_DATA(prescale) {prescale,/*0,*/null,null,null,null,TIMER_MODE_NORMAL} 
-#define MAKE_TIMER(data, counter,prescaler,sixteenBit,rtc,modes, \ 
- wgm0port, wgm0mask, wgm1port, wgm1mask, wgm2port, wgm2mask, wgm3port, wgm3mask, \ 
- compares,ovrintport,ovrintmask,ovrreqport,ovrreqmask,icr, \ 
- capintport,capintmask,capreqport,capreqmask, capedgeport,capedgemask,\ 
- incapin \ 
- ) \ 
- {&data, _SFR_MEM_ADDR(counter), _SFR_MEM_ADDR(prescaler), sixteenBit, rtc, sizeof(compares)/sizeof(TimerCompare),modes, \ 
-  { \ 
-   {_SFR_MEM_ADDR(wgm0port),BV(wgm0mask)}, \ 
-   {_SFR_MEM_ADDR(wgm1port),BV(wgm1mask)}, \ 
-   {_SFR_MEM_ADDR(wgm2port),BV(wgm2mask)}, \ 
-   {_SFR_MEM_ADDR(wgm3port),BV(wgm3mask)} \ 
-  },\ 
-  compares,\ 
- {_SFR_MEM_ADDR(ovrintport),BV(ovrintmask)},\ 
- {_SFR_MEM_ADDR(ovrreqport),BV(ovrreqmask)}, \ 
- _SFR_MEM_ADDR(icr),\ 
- {_SFR_MEM_ADDR(capintport),BV(capintmask)},\ 
- {_SFR_MEM_ADDR(capreqport),BV(capreqmask)}, \ 
- {_SFR_MEM_ADDR(capedgeport),BV(capedgemask)}, \ 
- incapin \ 
+#define MAKE_TIMER(data, counter,prescaler,sixteenBit,rtc,modes, 
+ wgm0port, wgm0mask, wgm1port, wgm1mask, wgm2port, wgm2mask, wgm3port, wgm3mask, 
+ compares,ovrintport,ovrintmask,ovrreqport,ovrreqmask,icr, 
+ capintport,capintmask,capreqport,capreqmask, capedgeport,capedgemask, 
+ incapin 
+ ) 
+ {&data, _SFR_MEM_ADDR(counter), _SFR_MEM_ADDR(prescaler), sixteenBit, rtc, sizeof(compares)/sizeof(TimerCompare),modes, 
+  { 
+   {_SFR_MEM_ADDR(wgm0port),BV(wgm0mask)}, 
+   {_SFR_MEM_ADDR(wgm1port),BV(wgm1mask)}, 
+   {_SFR_MEM_ADDR(wgm2port),BV(wgm2mask)}, 
+   {_SFR_MEM_ADDR(wgm3port),BV(wgm3mask)} 
+  }, 
+  compares, 
+ {_SFR_MEM_ADDR(ovrintport),BV(ovrintmask)}, 
+ {_SFR_MEM_ADDR(ovrreqport),BV(ovrreqmask)}, 
+ _SFR_MEM_ADDR(icr), 
+ {_SFR_MEM_ADDR(capintport),BV(capintmask)}, 
+ {_SFR_MEM_ADDR(capreqport),BV(capreqmask)}, 
+ {_SFR_MEM_ADDR(capedgeport),BV(capedgemask)}, 
+ incapin 
    } 

// Define the signature of code that is the destination of an rprintf output 
+0

郵政前後之間的標準差異。 – 2012-03-03 07:51:33

+0

@ IgnacioVazquez-Abrams - 發佈。 – Justin808 2012-03-03 08:02:46

回答

4

你需要告訴read不分裂的話(或者更確切地說,使其無法分拆的話)。

while IFS= read line 

此外,echo -e$line會做壞事。始終打印$line,並有條件地打印其他內容。

編輯:

啊哈。你還需要使用read -r來防止它殺死你的反斜槓。

+0

嗯......這留下了空白,但仍然破壞文件莫名其妙。我會發佈一個更新的腳本。 – Justin808 2012-03-03 07:46:46

+0

這個伎倆!萬分感謝 – Justin808 2012-03-03 08:11:31

0

這可能會爲你工作:

OIFS=$IFS; IFS=$'\n'; a=($(<libdefs.h)); IFS=$OIFS 
a[98]=$'// Added by build.sh\n#define PROGMEM\n#define prog_char\n'${a[98]} 
printf "%s\n" "${a[@]}" >libdefs.h.new 

或本:

{ head -n98 libdefs.h; 
printf "// Added by build.sh\n#define PROGMEM\n#define prog_char\n" 
tail -n+99 libdefs.h; } >libdefs.h.new 
相關問題