私のループの目的は、ファイルの各行の最初の桁を出力することです。ファイルは次のようになります:
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 など) には多くの改良が加えられていることに注意してください。