示例文件
橙汁
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
三行输入将首先加载所有变量,然后尝试反复读取simpleName
,itemName
将它们丢弃。或者当然这也会读取整个文件,例如四行输入将使所有变量为空。
我不确定你想在这里做什么,但也许是这样的:
while read -r simpleName itemName
&& read currentQuantity maximumQuantity
&& read description; do
process one set of values ...
done < "$FILE"