2011-07-03 74 views
6

我正在创建一个将列出文件的bash脚本(在本例中为apache站点可用)的过程中。列出这些文件很容易,因为我的最终目标是将每个文件都放入一个数组中,将它们显示给用户,并允许用户选择要处理的“文件”,在这种情况下,将启用该网站。从ls创建数组的bash脚本?

我已经不是很远得到了,我知道我需要设置LS为数组,然后循环操作:

array=$(ls) 
for sites in $array(2) 
do 
echo "$sites" 
done 

我知道,我需要索引的每个文件的目录然后允许用户键入要启用的号码。因此,它应该是这样的:

(1) newdomain.com 
(2) newdomain2.com 

Which site would you like to enable (i.e 1)? 

希望这是有道理的?

回答

6

通过使用内置的select功能,您可以节省很多重新实现。

select构造允许轻松生成菜单。它具有几乎相同的语法for命令:

select name [in words ...]; do commands; done 

in以下词语的列表展开,生成的项目的列表。扩展单词集将打印在标准错误输出流中,每个输出流前面都有一个数字。如果省略了in words,则会打印位置参数,就好像指定了in "[email protected]"一样。然后显示PS3提示,并从标准输入中读取一行。如果该行由与显示的单词中的一个相对应的数字组成,则将name的值设置为该单词。如果该行为空,则会再次显示文字和提示。如果读取EOF,则select命令完成。读取的任何其他值都会导致name设置为空。读取的行保存在变量REPLY中。

+0

谢谢,我会看看select命令。 –

6

这不是你如何使用ls

array=(*) 
+0

在当前目录下工作,但是脚本可以从任何地方调用,所以我必须定义完整路径(即/ etc/apache2/sites-available /)。 –

+0

这与你需要用'ls'做什么不同? –

+1

澄清:你需要一组圆括号来表示一个数组赋值,所以至少你需要说'array =($(ls whatever))'。否则,你会得到一个很长的字符串。 – geekosaur

-1

一些提示,让你开始:

APACHE_CONF=/etc/apache2 
SITES_TO_ENABLE="site1.org | site2.com" 
LIST_AVAILABLE=$(ls $APACHE_CONF/sites-available) 
LIST_ENABLED=$(ls $APACHE_CONF/sites-enabled) 

for site in $(echo $SITES_TO_ENABLE | sed -e "s/|//g") 
do 
    FOUND=$(echo $LIST_AVAILABLE | sed -e "s/ /\n/g" | egrep $site) 
    [[ ! -z $FOUND ]] && echo "Checking availability of $site: Ok" 
    [[ -z $FOUND ]] && echo "Checking availability of $site: Nok, site \"$site\" required for production has not been found or is not defined" && exit 1 
done 

选择当然您可以结合这种方式。

+0

这仅适用于其中一个目录中的文件在其名称或通配符中包含空格或其他任何不可打印或在IFS内找到的其他文件。另见http://mywiki.wooledge。组织/ ParsingLs –