使用 exec <file 从文件读取后无法从用户读取

Can't read from user after using exec <file to read from file

我有以下代码

#!/bin/bash
declare -i max
exec < lista.csv
read header
max=0
while IFS=, && read -r id _ _ _ _ _
do
    if [ "$id" -gt "$max" ]
    then
        max=$id
    fi
done
((id=max+1))
read -p "Nume: " nume
echo "Prenume: "
read prenume
echo "Grupa: "
read grupa
echo "Seria: "

问题是当我 运行 它不让我输入值时,CSV 文件中有这样的内容:

44,,,,,

exec 命令重定向脚本其余部分的标准输入,因此所有 read 命令最终都会从您的文件句柄中读取,该文件句柄很快就会 return 为空消耗文件中的所有数据时的行数。

您还希望避免为脚本的其余部分重置 IFS; IFS="," read 暂时 仅在 read 命令期间覆盖其值。 (感谢 Fravadona 在评论中提到这一点。)

显然你正在寻找类似

的东西
#!/bin/bash
declare -i max
exec 3< lista.csv
read -u 3 header
max=0
while IFS=, read -u 3 -r id _  # no need to put many _ if you don't use them; the last one will simply contain the remaining fields
do
    if [ "$id" -gt "$max" ]
    then
        max=$id
    fi
done
((id=max+1))
read -p "Nume: " nume
echo "Prenume: "
read prenume
echo "Grupa: "
read grupa
echo "Seria: "

...虽然更好的解决方案可能是

#!/bin/bash
declare -i id
id=$(awk -F, 'NF==1 { next } NF==2 || max> { max= } END { print max+1 }' lista.csv
read -p "Nume: " -r nume
read -p "Prenume: " -r prenume
read -p "Grupa: " -r grupa
echo "Seria: "

如果您正在尝试重新实现 adduser 命令,也许看看它是否已经实现(Debian 和 Arch 都有一个同名的命令,尽管它们的继承是不同的 IIFC)and/or 如果您可以通过设置 locale.

让它以您的语言打印消息