从ls创建数组的Bash脚本?

时间:2011-07-03 05:25:48

标签: linux arrays bash scripting

我正在创建一个列出文件的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)?

希望这有意义吗?

3 个答案:

答案 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

当然,您可以将此方法与选择结合使用。