Bourne Shellのdo whileループはすべてのデータを返しますが、2つのエラーがあり、そのようなファイルまたはディレクトリはなく、シェル名が繰り返されます。

Bourne Shellのdo whileループはすべてのデータを返しますが、2つのエラーがあり、そのようなファイルまたはディレクトリはなく、シェル名が繰り返されます。

私のループの目的は、ファイルの各行の最初の桁を出力することです。ファイルは次のようになります:

256-56-8411     Bob     3.61    Junior          CS
471-44-7458     Tim     3.45    Senior          CE
326-56-4286     Rajesh  2.97    Freshman        TE
548-66-1124     Eric    2.88    Sophomore       EE
447-21-3599     John    2.51    Junior          CS
911-41-1256     Rebecca 3.92    Senior          CS
854-22-6372     Robin   2.45    Freshman        TE

スクリプトを実行した後の出力は次のようになります。

    This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.

最後に、コードは次のとおりです。

echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount=`wc -l < $1 `
tempFile=`cut -c1 $1`
while read n
do
echo "$n"
done < $tempFile

echo "$studentCount is the number of students in the input file."

これを修正したら、while ループを使用して最初の数字が 4 かどうかを確認し、4 で始まらない ID (最初の列) がいくつあるかを示す予定です。

私のアプローチよりもクリーンなソリューションについて学ぶことは構いませんが、これは授業用であり、私たちはそれほど多くを学んでいないと思います。これまでの過程で、awk で同様のことをたくさん見てきましたが、私たちはまだ awk をまったく学んでいません。

しかし、基本的には、ループから必要なデータをすべて取得できました。ただし、2 つの追加ビットが追加されました。

答え1

この行に書いた内容:

tempFile=`cut -c1 $1`

というファイルを作成しませんtempFile。したがって、そこから読み取ることはできません。

この行を次のように変更できます。

cut -c1 "$1" > tempFile

そして、ループが読み取るためにというファイルtempFileが作成されます。変数がnull (存在しない) であるため、そのループでは を使用しないでください。($ なし) のようなものを使用してください。while read$tempFile$tempfile

done < tempFile

ただし、単純なコマンドはcut -c1 "$1"ソース ファイルの最初の文字をすべて書き込むので、これを実行するだけで確認できます。

cut -c1 "sourcefile"

これを知っていれば、値を保持するために tempFile は必要なく、ヒアドキュメントを使用するだけです。

ヒアドキュメントを使用して、スクリプト内のその他の問題をクリーンアップします。

#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"

while read n
do
    echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_

echo "$studentCount is the number of students in the input file."

どのインタープリターがコードを実行するかを示すために、シバン (#!) を使用するのがよい方法です。 この場合は、shについて言及されているため、が望ましいと想定しましたBourne shell。 オリジナルの Bourne シェルはかなり古く (~1979)、最近のシェル (ksh、bash、mksh、zsh など) には多くの改良が加えられていることに注意してください。

関連情報