ファイルから複数の変数を読み取る方法

ファイルから複数の変数を読み取る方法

サンプルファイル

オレンジジュース

10100

オレンジジュースヴァンガロン。

これが私がしたことで効果がありました。

while read -r simpleName itemName; do
        read currentQuantity maximumQuantity
        read description

        echo "Item Name: $itemName"
        echo "Simple Name: $simpleName"
        echo "Item Number: $itemNumber"
        echo "Qty: $currentQuantity/$maximumQuantity"
        echo "Description: $description"
    done < $FILE

注:この前に、ユーザーにプロジェクト番号の入力を求められ、開くファイルを決定します。

whileループはファイルを正しく読み込み、変数を保存し、必要な出力を提供します。問題は、同じwhileループをもう2回使用しましたが、うまくいかなかったことです。何らかの理由で他の2つのケースでは、simpleNameとitemNameは空白として表示されますが、残りは正常に機能します。

これはうまくいかない例です。

#!/bin/bash

echo ""
read -p "Enter an item number: " itemNumber
echo ""

FILE="./data/${itemNumber}.item"
date=`date "+%Y-%m-%d %H:%M:%S"`

if test -f $FILE; then

    if test -f ./data/queries.log; then
        echo "DELETED: $date - $simpleName" >> ./data/queries.log
    else
        > ./data/queries.log
        echo "DELETED: $date - $simpleName" >> ./data/queries.log
    fi

    while read -r simpleName itemName; do
        read currentQuantity maximumQuantity
        read description
    done < $FILE

    rm $FILE

    echo "$simpleName was successfully deleted."
else
    echo "ERROR: item not found."
fi

ここで、出力エラーは次のとおりです。

削除されました。

したがって、$ simpleNameは何らかの理由で空です。なぜそれが最初のインスタンスでは動作しますが、これは動作しないのか理解していません。

注:両方のインスタンスは別々のスクリプトファイルにあります。

タスクを実行するより簡単な方法があることを知っていますが、非常に基本的なコマンドに限定されており、sed、awk、grep、findなどの下に表示されるものとほとんど同じコマンドを使用することはできません.

ベストアンサー1

read変数には予期された区切り文字が表示されず、エラー状態で終了した場合でも常に値が割り当てられます。

例えば

$ (var=abcdef; 
   echo "      var=\"$var\"";
   read var;
   echo "ret=$? var=\"$var\"") < /dev/null
      var="abcdef"
ret=1 var=""

ループで最終的に不完全な行を処理するイディオムも参照してくださいwhile read`読み取り中に-r行||はどういう意味ですか? [[ -n $line ]]` とはどういう意味ですか?

だからあなたがこれを持っているとき:

while read -r simpleName itemName; do
    read currentQuantity maximumQuantity
    read description
done < $FILE

3行の入力は最初にすべての変数をロードし、次にsimpleName読み続けようとするとitemNameその変数を削除します。あるいは、もちろんファイル全体を読むこともできます。たとえば、4行の入力により、すべての変数が空になります。

ここで何をしたいのか分かりませんが、おそらく次のようになります。

while    read -r simpleName itemName
      && read currentQuantity maximumQuantity
      && read description; do
    process one set of values ...
done < "$FILE"

おすすめ記事