我正在创建一个列出文件的bash脚本(在这种情况下是apache sites-available)。列出文件很容易,我的最终目标是将每个文件放入一个数组中,将它们显示给用户并允许用户选择要处理的“文件”,在这种情况下,它将启用该站点。
我还没有走得太远,我知道我需要将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)?
希望这有意义吗?
答案 0 :(得分:6)
您可以使用内置的select
功能为自己节省大量的重新实现。
select
构造允许轻松生成菜单。它的语法与for
命令几乎相同:select name [in words ...]; do commands; done
展开
in
后面的单词列表,生成项目列表。扩展单词集打印在标准错误输出流上,每个前面都有一个数字。如果省略in words
,则打印位置参数,就像指定了in "$@"
一样。然后显示PS3
提示符,并从标准输入中读取一行。如果该行包含与所显示的单词之一对应的数字,则name
的值将设置为该单词。如果该行为空,则再次显示单词和提示。如果读取了EOF,则select
命令完成。读取的任何其他值都会导致name
设置为null。读取的行保存在变量REPLY
中。
答案 1 :(得分:6)
这不是你使用ls
的方式。
array=(*)
答案 2 :(得分:-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
当然,您可以将此方法与选择结合使用。