从ls创建数组的Bash脚本?

jas*_*t.h 6 linux arrays bash scripting

我正在创建一个列出文件的bash脚本(在这种情况下是apache sites-available).清单文件是很容易通过我的最终目标是每一个这些文件考虑到一个数组,它们显示给用户,并允许用户选择其中的"文件"来处理,在这种情况下,将启用站点.

我还没有走得太远,我知道我需要将ls设置为数组然后循环操作:

array=$(ls)
for sites in $array(2)
do
echo "$sites"
done
Run Code Online (Sandbox Code Playgroud)

我知道我需要索引目录中的每个文件,然后允许用户键入要启用的数字.所以它看起来像这样:

(1) newdomain.com
(2) newdomain2.com

Which site would you like to enable (i.e 1)?
Run Code Online (Sandbox Code Playgroud)

希望这有道理吗?

gee*_*aur 6

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

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

select name [in words ...]; do commands; done
Run Code Online (Sandbox Code Playgroud)

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


Ign*_*ams 6

那不是你的使用方式ls.

array=(*)
Run Code Online (Sandbox Code Playgroud)

  • 这是一篇很好的文章,解释了为什么[解析`ls`是一个坏主意](http://mywiki.wooledge.org/ParsingLs). (8认同)
  • @jason.dot.h, `array=( /etc/apache2/sites-available/* )` 工作正常。如果你想在扩展时去掉目录名,这很容易做到:参考 `"${array[@]##*/}"` 并且你只得到文件名,没有使用 `ls` 带来的所有错误以编程方式。 (2认同)