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

tempFilewhile readそして、ループが読み取れるように名前付きファイルが作成されます。$tempFile変数は$tempfilenull(存在しない)なので、そのループで使用しないでください。次のように使用してください($を除く)。

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."

どのインタプリタがコードを実行する必要があるかを示すために、she-bang(#!)を使用することをお勧めします。この場合は、私がsh言及したので欲しいとしますBourne shell。もともとBourneシェルはかなり古く(〜1979)、最新のシェル(ksh、bash、mksh、zshなど)に多くの改善が追加されました。

関連情報