正确使用bash选择菜单并一起阅读

时间:2016-05-07 08:19:09

标签: bash stdin

我有一个文本文件(lst.txt),每行包含一对逗号分隔的名称:

action_type(1, 2, 3)

和脚本(sct.sh):

file1,file2
file3,file4
file5,file6
...

我跑了这个:

i=1
while read inp
do 
    echo " -- Line $((i++))"   
    file1=`echo $inp | sed -e "s/,.*$//g"`
    file2=`echo $inp | sed -e "s/^.*,//g"`

    ##### select block
    select fname in "$file1" "$file2"
    do 
        case $fname in
            $file1) echo -e "Delete $file1.\n";;
            $file2) echo -e "Delete $file2.\n";;
        esac
        break
    done
    ##### select block ends
done

现在的问题是:

$cat lst.txt | ./sct.sh

1. it would not wait for my reply; 2. some input lines get dropped (but if the select block is commented out, all lines are there). 在这里提供read回复?如何使这个脚本工作?

2 个答案:

答案 0 :(得分:5)

两件事。

首先,您可以使用sd变量将$IFS分隔为read分隔的字段。

其次,您需要明确地从,读取select,以防止它读取您的所有标准输入:

/dev/tty

答案 1 :(得分:0)

还要看看percol,fzy,smenu和朋友。他们很乐意从stdin中获取,提供一个用户友好的选择菜单和交互式过滤器,然后再选择管道。