作为作业的可选部分,我正在使用 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= (*)
会产生语法错误。