サンプルファイル
オレンジジュース
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"