Bash脚本,从ls创build一个数组?

我正在创build一个bash脚本,列出这些文件(在这种情况下,Apache网站可用)的过程中。 列出文件很容易,我的最终目标是将每个文件都放到一个数组中,将它们显示给用户,并允许用户select要处理的“文件”,在这种情况下,将启用该网站。

我还没有走得很远,我知道我需要将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 (ie 1)? 

希望这是有道理的?

这不是你如何使用ls

 array=(*) 

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

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

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

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

一些提示让你开始:

 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 

你可以结合这个方法,当然选择