【问题标题】:Bash script that creates an Array from ls?从 ls 创建数组的 Bash 脚本?
【发布时间】:2011-09-27 12:31:57
【问题描述】:

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

我还没有走多远,我知道我需要将 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)?

希望这是有道理的?

【问题讨论】:

    标签: linux arrays bash scripting


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这不是你使用ls的方式。

      array=(*)
      

      【讨论】:

      • 这在当前目录中有效,但是可以从任何地方调用脚本,所以我必须定义完整路径(即 /etc/apache2/sites-available/)。
      • 这与您对ls 的处理方式不同,如何?
      • 澄清:您需要一组括号来指示数组分配,因此您至少需要说array=($(ls whatever))。否则你会得到一个长字符串。
      • 这是一篇很好的文章,说明了为什么parsing ls is a bad idea。
      • @jason.dot.h, array=( /etc/apache2/sites-available/* ) 工作正常。如果你想在展开时去掉目录名,这很容易做到:参考"${array[@]##*/}",你只会得到文件名,而没有以编程方式使用ls的所有错误。
      【解决方案3】:

      一些提示让你开始:

      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
      

      您当然可以将此方法与 select 结合使用。

      【讨论】:

      • 这仅在其中一个目录中的文件在其名称中包含空格、或通配符、或在IFS 中包含任何其他不可打印或发现时才有效。另见mywiki.wooledge.org/ParsingLs
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2013-10-02
      • 1970-01-01
      • 2017-11-01
      • 2021-08-29
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多