选择循环不处理存储在数组中的字符串中的空间

选择循环不处理存储在数组中的字符串中的空间

作为作业的可选部分,我正在使用 select 制作一个交互式菜单,并让它支持带空格的文件名和目录名。重点是用户可以使用给定的功能选择与哪个文件或目录进行交互,这在交互菜单中已经确定。我必须使用 select 作为要求的一部分。在本例中,我尝试使用 cat 来获取文件的存储信息。

但这不起作用

shopt -s nullglob
FARRAY= (*)
shopt -u nullglob
PS3= "Please select a file"
select SHOLDER in "${FARRAY[@]}"
do
   if  test -d "${FARRAY[$SHOLDER]}"
   then
       echo "Please select a file"
   else
       cat "${FARRAY[$SHOLDER]}"
       break
   fi
done

我收到错误:表达式中的语法错误(错误标记是“那里”)。你好,这是我一直在测试的文件名

如果我加上“!”在 select 循环和 cat 部分中的数组名称前面, "${!FARRAY[@]}" 它可以工作,但只向用户显示数组索引而不是文件名,这实际上不可用。我想知道为什么会出现这种情况,以及我需要采取哪些步骤才能使我的脚本正确执行此部分。

答案1

help select

select: select NAME [in WORDS ... ;] do COMMANDS; done

[...] 如果该行由与所显示的单词之一相对应的数字组成,则 NAME 将设置为该单词。

例如:

$ select foo in abc def; do echo "foo is '$foo'"; break; done
1) abc
2) def
#? 2
foo is 'def'

也就是说,如果您选择一个名为 的文件foo.c,然后SHOLDER将其设置为foo.c(而不是文件的数量),那么当对数组进行索引时,这将产生算术错误。

您可能还会遇到问题,因为select选项从 1 开始编号,而 Bash 数组从 0 开始索引。

最好将代码复制并粘贴到此处的问题中,这样可以避免拼写错误,从而使问题变得混乱。就像这里作业中的空格一样,FARRAY= (*)会产生语法错误。

相关内容