2011-04-01 48 views
0

我的問題是這樣的:我有這樣的bash腳本:bash腳本代碼C程序中

#!/bin/bash 

IFSBAK=$IFS 
if [ "$TXTEXT" = "" ]; 
then 
    CMD="find . -iname \"*.txt\" -or -iname \"*.text\"" 
else 
CMDTEMP="find . " 
IFS=":" 
for i in $TXTEXT 
do 
    CMDTEMP="${CMDTEMP} -iname \"*.${i}\" -or" 
done 
IFS=$IFSBAK 
CMD=${CMDTEMP%-or} 
fi 

FILES=$(eval $CMD) 
OUTPUT=$1 

for f in $FILES 
do 
VAR=$(grep -ae [a-zA-Z0-9] "$f" | tr -cs "[:alnum:]" "\n") 
IFS=$' \n\t-?=!*][.\",();\'\`\´:' 
for v in $VAR 
do 
    echo $v >> "${OUTPUT}" 
done 
IFS=$' \n\t' 
done 

,我需要插入一個C程序中的代碼。我嘗試在單行上重新編寫所有腳本,並直接使用shell進行測試,並且它可以正常工作,但是我在引用和轉義方面遇到問題,試圖將其作爲system()調用的參數使用。 你能建議我一個出路嗎?

謝謝您的幫助

+6

似乎是一個強大的壞主意,插入多shell代碼轉換成二進制 – Anycorn 2011-04-01 18:37:31

+3

+1 @Anycom - 任何時候,你認爲你需要做這樣的事情嵌入30行shell腳本在你的程序,你需要重新考慮一下設計。 – 2011-04-01 18:38:34

+0

我已經知道這是一件可怕的事情,但我不得不按照要求去做。無論如何,謝謝你 – Peter 2011-04-01 18:47:33

回答

3

把它放進一個shell腳本,然後在C代碼中調用shell腳本。更容易維護恕我直言。

+0

如何從C代碼訪問Linux shell腳本中的函數? – abc 2013-01-25 05:41:44

+0

@abc你不能。您將shell腳本作爲外部可執行文件調用,然後讀取輸出。 – 2013-01-25 16:29:05

4

如果你真的別無選擇,只能提供一個單一的二進制,你不能船舶shell腳本文件,二進制考慮以下幾點:

  1. 包括腳本的內容,在一個單一的文字
  2. 在程序執行期間,將文字的內容打印到臨時文件。您可能需要一些策略來創建一個唯一的文件名。
  3. 通過電話呼叫system()
  4. 臨時腳本刪除臨時文件

然而,認爲這是最後的手段。

0
#define SHELLSCRIPT " 
... 
write your shell script code here 
... 
" 



    int main() 
    { 

     system(SHELLSCRIPT); 
     return 0; 
     //put the bash to C program 
    }