我正在创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
你可以结合这个方法,当然选择 。