我的剧本中我做错了什么?

时间:2016-03-02 23:31:28

标签: arrays bash

我编写了这个脚本,假设逐行读取文件,然后执行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

3 个答案:

答案 0 :(得分:2)

您正在复制stdin fd编号0到10并将stdin设置为file。因此,readwhilenum)的所有进一步输入都来自文件。由于您不打算为第二个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 numread 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 numread num <&10,两者都有效。