2017-05-06 25 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