Чтение из архива с помощью Bourne Shell - PullRequest
0 голосов
/ 22 сентября 2010

Я пытаюсь использовать сценарии оболочки Bourne впервые и не могу понять, как определить, как сохранить текст из файла во внутренние переменные сценария. Формат файла следующий:

acc.text

Jason Bourne 213.4
Alice Deweger 1
Mark Harrington 312

Текущий скрипт, который у меня есть (который может быть ВСЕ неправильным, так как я просто создаю его в NotePad ++ без использования реальной консоли оболочки), выглядит следующим образом:

#!/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 

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Я исправил некоторые из ваших сценариев. Вам нужно 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
0 голосов
/ 23 сентября 2010

Учитывая указанный вами формат файла, каждая запись имеет три поля: сначала последнее и сумма, затем:

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

Оболочка считывает встроенную, автоматически разбивает ввод. Смотрите переменную IFS на странице man для sh (1). Если у вас есть данные после поля количества, и вы хотите их игнорировать, просто создайте другую переменную после суммы; но не используйте его. Он соберет все после 1-го поля в дополнительную переменную.

Вы указали оболочку Bourne, поэтому я использовал довольно устаревшие вещи:

i=`expr $x + 1`

обычно пишется

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

В современных системах / bin / sh обычно ksh или что-то довольно совместимое. Вы, вероятно, можете использовать let $((i++))

...