使用 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
.
让它以您的语言打印消息
我有以下代码
#!/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
.