2017-05-06 62 views
0

我有一个文件list.txt它包含文件的列表中打开一个文件:使用bash选择命令从文件列表

file-1.txt 
file-2.txt 
... 
file-n.txt 

我想用猛砸select命令生成菜单,所以我可以打开我选择的文件。

我试过,但它不工作:

select d in list.txt; 
do test -n "$d" && break; 
echo ">>> Invalid Selection"; 
done 
open "$d" 
+0

不知道你想要什么。请[mcve]。明确问题的明确问题有更多机会提供更好的答案。 – jm666

回答

0

下面是结束了工作,所有功劳@ eush77和@ilkkachu。

我添加了一个额外的部分:文件列表是由搜索程序(ripgrep)生成的。代码似乎处理文件名中的空格。

#!/opt/local/bin/bash 
list=$(rg --files |grep -i [email protected]) 
IFS=$'\n' 
select file in $list 
    do test -n "$file" && break; 
exit; 
done 
open "$file" 
1

the Bash manual

选择名[中字]。做清单;完成

扩展后面的单词列表,生成项目列表。扩展单词集打印在标准错误 上,每个前面都有一个数字。 [...]

在您的示例中,单词列表可扩展为单个单词list.txt(而不是您想要的此文件中的行列表)。您需要使用命令替换为:

select d in $(<list.txt); # Change this line 
do test -n "$d" && break; 
echo ">>> Invalid Selection"; 
done 
open "$d" 
1
$ help select 
select: select NAME [in WORDS ... ;] do COMMANDS; done  
... 

选择需要的单词列表,就像for,而不是一个文件名。

您需要使用类似select d in $(cat list.txt)的内容来读取文件中的选项。但要小心字词拆分和文件名拼接的常见问题,即如果列表中的名称可以包含空格,则设置IFS=$'\n',如果它们可以包含浮点字符,则使用set -f