0

初めて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 
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

指定したファイル形式を指定すると、各レコードには、最初に最後と金額の3つのフィールドがあり、次に次のようになります。

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シェルを指定したので、かなり時代遅れのものを使用しました。

i=`expr $x + 1`

通常は書かれています

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

最近のシステムでは、/ bin/shは通常kshまたはかなり互換性のあるものです。あなたはおそらく使用することができますlet $((i++))

于 2010-09-23T17:28:21.033 に答える