我编写了这个脚本,假设逐行读取文件,然后执行while循环并将输出设置为数组,但由于某种原因,我的脚本在继续之前不会等待用户输入,它会自动选择0。
#!/usr/bin/bash
declare -a ArrayBox
filename="text.txt"
exec 10<&0
exec < $filename
x=0
while read line
do
ArrayBox[$x]=$line
echo "[$x] $line"
let x++
if [[ $x -eq 5 ]]
then
echo "Enter your chose: "; read num;
echo "you chose ${ArrayBox[$num]}"
fi
done
#Output
[0] as
[1] ag
[2] sd
[3] gh
[4] tr
Enter your chose:
you chose as
[5] fg
[6] fg
答案 0 :(得分:2)
您正在复制stdin
fd编号0到10并将stdin设置为file。因此,read
(while
和num
)的所有进一步输入都来自文件。由于您不打算为第二个read
via文件提供数据,因此它采用您之前设置的默认值,即0.在这种情况下,您需要明确告诉read
读取来自stdin(您之前制作的重复fd,即fd 10
)
help read
的是这样的:
-u fd从文件描述符FD而不是标准输入
读取
#!/bin/bash
declare -a array=()
declare -i x=0
exec 10<&0
exec < "input_file.txt"
while IFS='' read -r line || [[ -n "$line" ]]
do
array+=("$line")
echo "[$x] $line"
x=$((x+1))
if [[ $x -eq 5 ]]
then
echo 'Enter your choice: '
read -u 10 choice
echo "You chose: ${array[$choice]}";
fi
done
这是输出:
$ cat -n input_file.txt
1 line1
2 line2 abcd
3 line3 abc
4 line4 ab
5 line5 a
6 line6
7 line7
$ ./script.bash
[0] line1
[1] line2 abcd
[2] line3 abc
[3] line4 ab
[4] line5 a
Enter your choice:
3
You chose: line4 ab
[5] line6
[6] line7
$
编辑:正如Huihoo指出你可以使用read -u 10 num
或read num <&10
来阅读fd 10.感谢Huihoo
答案 1 :(得分:0)
您可以使用sed
从文件中读取特定行(第一行号为1,而不是0)。一个例子:
#!/usr/bin/bash
declare -a ArrayBox
filename="text.txt"
x=1
while true
do
line=`sed "${x}q;d" ${filename}`
ArrayBox[$x]=$line
echo "[$x] $line"
let x++
if [[ $x -eq 6 ]]
then
echo "Enter your chose: "; read num;
echo "you chose ${ArrayBox[$num]}"
break
fi
done
答案 2 :(得分:0)
您可以将read num
替换为read -u 10 num
或read num <&10
,两者都有效。