0

我第一次尝试使用 Bourne shell 脚本,但我似乎无法确定如何将文本从文件保存到内部脚本变量。文件格式如下:

附件文本

Jason Bourne 213.4
Alice Deweger 1
Mark Harrington 312

我拥有的当前脚本(可能完全不正确,因为我只是在 NotePad++ 中创建它而不使用实际的 shell 控制台)如下:

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

2 回答 2

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
于 2010-09-22T07:43:47.390 回答
0

给定您指定的文件格式,每条记录都有三个字段,首先是 last 和 amount,然后:

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++))

于 2010-09-23T17:28:21.033 回答