2010-09-21 99 views
0

我想第一次使用Bourne shell腳本,並且似乎無法確定如何將文本從文件保存到內部腳本變量。文件格式如下:使用Bourne Shell從檔案中讀取

acc.text

Jason Bourne 213.4 
Alice Deweger 1 
Mark Harrington 312 

當前的腳本,我有(因爲我在記事本+ +,而無需使用實際的外殼控制檯簡單地創建它,這可能是不正確完全)是如下:

#!/bin/sh 

process_file() 
{ 

FILE = $1; 
SALARYARRAY; 
NAMEARRAY; 
COUNTER = 0; 

while read line 
    do 
$NAMEARRAY[$COUNTER] = 
    $SALARYARRAY[$COUNTER] = 
$COUNTER + 1; 
echo $NAMEARRAY[$COUNTER]:$SALARYARRAY[$COUNTER]; 
done < "$FILE" 

order_Map 
} 

# Function is not complete as of now, will later order SALARYARRAY in descending order 
order_Map() 
{ 
i = 0; 
for i in $COUNTER 
do 
    if ($SALARYARRAY[ 
done 

} 

## 
# Main Script Body 
# 
# Takes a filename input by user, passes to process_file() 
## 

PROGRAMTITLE = "Account Processing Shell Script (APS)" 
FILENAME = "acc.$$" 


echo $PROGRAMTITLE 

echo Please specify filename for processing 
read $FILENAME 

while(! -f $FILE || ! -r $FILE) 
    do 
    echo Error while attempting to write to file. Please specify file for processing: 
    read $FILENAME 
    done 


echo Processing the file... 
process_file $FILENAME 
+0

運行此腳本時會發生什麼?增量編寫腳本。首先看看你是否可以讀取並回顯文件中的行。 – dogbane 2010-09-21 22:49:25

+0

因爲我只是使用NotePad ++,所以無法運行它。我試圖從語言功能的例子中工作並重新應用它們。我希望沒有可怕的明顯錯誤,但我不能保證。我理解增量設計的必要性,並且我無法在沒有環境的情況下創建腳本,但事實如此。 – Nelson 2010-09-21 22:56:58

+0

你需要有一個環境來測試。如果你沒有Unix,你爲什麼不嘗試在Windows上安裝Cygwin? – dogbane 2010-09-22 07:07:56

回答

0

給你指定的文件格式,每條記錄有三個字段倒數第一和金額,則:

i=0 
while read fistname lastname amount; do 
    NAMEARRAY[$i]="$firstname $lastname" 
    SALARYARRAY[$i]=$amount 
    i = `expr $i + 1` 
done < "$FILE" 

殼讀內置的自動拆分輸入。在sh(1)的手冊頁中查看變量IFS。如果您在金額字段後面有數據,並且您希望忽略它,只需在金額後創建另一個變量;但不要使用它。它會收集第一個3字段後的所有內容到額外的變量中。

您指定Bourne shell的,所以我用一些非常陳舊的東西:

i=`expr $x + 1` 

通常寫作

let $((i++)) # ksh, bash (POSIX, Solaris, Linux) 

在現代系統中,/ bin/sh的通常是KSH什麼漂亮的兼容。您可以使用let $((i++))

+0

謝謝你們的幫助。 – Nelson 2010-09-23 21:36:22

2

我修復了一些腳本。在將數據存儲到數組之前,您需要從每行的名稱和薪水字段中刪除cut

#!/bin/bash 

process_file() 
{ 
file=$1; 
counter=0 
while read line 
do 
     #the name is the first two fields 
     name=`echo $line | cut -d' ' -f1,2` 
     NAMEARRAY[$counter]="$name" 

     #the salary is the third field 
     salary=`echo $line | cut -d' ' -f3` 
     SALARYARRAY[$counter]="$salary" 

     echo ${NAMEARRAY[$counter]}:${SALARYARRAY[$counter]} 

     counter=$(($counter+1)) 
done < $file 
} 


## 
# Main Script Body 
# 
# Takes a filename input by user, passes to process_file() 
## 

PROGRAMTITLE="Account Processing Shell Script (APS)" 
echo $PROGRAMTITLE 

echo -n "Please specify filename for processing: " 
read FILENAME 

if [ -r $FILENAME ] #check that the file exists and is readable 
then 
     process_file $FILENAME 
else 
     echo "Error reading file $FILENAME" 
fi