0

ユーザー入力がcsvデータ内にあるかどうかを確認する目的でループしようとしているcsvファイルがあります。私は次のコードを書きましたが、これは時々機能し、他のコードは機能しません。2桁以上の数字と比較しようとすると、常に機能しなくなります。1 から 9 までの数字で問題なく動作しますが、一度入力すると 56 、または 99 または 100 と言うと、動作しなくなります。

csv データはコンマ区切りです。約 300 行ありますが、このようなものです。

1,John Doe,Calculus I,5.0
1,John Doe,Calculus II,4.3
1,John Doe,Physics II,3.5
2,Mary Poppins,Calculus I,3.7
2,Mary Poppins,Calculus II,4.7
2,Mary Poppins,Physics I,3.7

データはそのままで、ID #100 までの合計 300 行です。shファイルとcsvファイルの両方が同じフォルダーにあります。テキストエディターとしてgeditを使用して、Ubuntu 12.04.3の新規インストールを使用しています。

変数 ID と IF 条件の内部をエコーし​​ようとしましたが、同じ値をテストするときに本来の動作をしません。誰かが私を正しい方向に向けることができますか?ありがとう

コードは次のとおりです。

#s!/bin/bash
echo "enter your user ID";
read user;

INPUT_FILE=notas.csv
while IFS="," read r- ID name asignature final;
do
if [$ID = $user]; then
userType=1;
else
userType=2;
fi
done < notas.csv
4

2 に答える 2

0

if テスト文で変数を引用する必要があります。-eqまた、文字列比較ではなく、数値テストを実行する必要があります=。したがって、ifステートメントは次のようになります。

if [[ "$ID" -eq "$user" ]]
于 2013-11-05T03:34:29.207 に答える
0

さて、書かれたコードにはいくつかの問題があります。

  1. あなたは行の代わりに持っています-r-それはあなたの実際のコードには存在しないタイプミスであるか、それほど遠くまでは行かないと思います.-rread

  2. [同様に、 ...]括弧の周りにスペースが必要です:[$IDは構文エラーです。

  3. 句でパラメーター展開を引用するifか、ブラケットの種類を切り替える必要があります。@imp25が提案したように、おそらく数値比較を行います。これは、 ((...を使用して行います))

  4. ファイルの最後にリストされている人 (おそらく ID 100) を除くすべての人に 2 が設定されるためuserType、節で 2 に設定することはおそらく望ましくありません。elseループの外側で、最初に 2 に設定します。次に、ループ内で一致が見つかったら、それを 1 に設定してループから抜け出します。

    userType=2
    while IFS=, read -r ID name asignature final; do
      if (( $ID == $user )); then 
        userType=1;
        break
      fi
    done < notas.csv
    

awk などのシェル ツールを使用することもできます。

userType=$(awk -F, -vtype=2 '($1=="'"$user"'") {type=1}; END {print type}' notas.csv)

またはgrep:

grep -q "^$user," notas.csv
userType=$(( $? + 1 ))

于 2013-11-05T03:46:18.413 に答える