如何从文件中读取多个变量

如何从文件中读取多个变量

示例文件

橙汁

10 100

半加仑橙汁。

这就是我所做的并且有效

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 循环两次,但它不起作用。由于某种原因,在其他两种情况下,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`while read -r line || 是什么意思? [[ -n $line ]]` 是什么意思?

所以,当你有这个:

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

三行输入将首先加载所有变量,然后尝试反复读取simpleNameitemName将它们丢弃。或者当然这也会读取整个文件,例如四行输入将使所有变量为空。

我不确定你想在这里做什么,但也许是这样的:

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

相关内容