在';[]和#x27;在';apt[]和#x27;在bash?

在';[]和#x27;在';apt[]和#x27;在bash?,bash,ubuntu,Bash,Ubuntu,我正在学习触摸打字,我按了“[”而不是“-”。当我进入下一行时,我什么都做不了,直到我输入了k 然后我得到了一个未找到的命令错误。 这是一件容易得到的事情还是别的什么 谢谢。这是因为用于设置数组元素的bash语法 如果arr是一个数组变量 arr[7]=Seventh 将数组的元素7设置为字符串7。因此,如果bash需要一个可能的赋值,那么它会将word[解释为一个下标运算符,即使word不是一个已知的数组变量。(如果它还不是数组变量,它将被创建为数组变量。) 数组下标是数值上下文(除非数组已

我正在学习触摸打字,我按了“[”而不是“-”。当我进入下一行时,我什么都做不了,直到我输入了k

然后我得到了一个未找到的命令错误。 这是一件容易得到的事情还是别的什么


谢谢。

这是因为用于设置数组元素的bash语法

如果
arr
是一个数组变量

arr[7]=Seventh
将数组的元素7设置为字符串7。因此,如果bash需要一个可能的赋值,那么它会将
word[
解释为一个下标运算符,即使
word
不是一个已知的数组变量。(如果它还不是数组变量,它将被创建为数组变量。)

数组下标是数值上下文(除非数组已声明为关联数组)。在数值上下文中,您可以键入算术表达式,而无需将
$
用作变量符号。在数值上下文中,将忽略空格,因此换行符是可以的

如果
apt
被声明为关联数组,您仍然可以使用以下方法分配元素,例如

apt[
key
]=42
但是,在这种情况下,不会忽略换行符,因此它们成为键的一部分


如果在
]
之后没有
=
,则该单词不是数组赋值,因此被视为单词。但到那时,它已经被阅读,新行和所有。(路径名扩展发生在单词拆分之后,因此
bash
将尝试将单词与当前目录中的文件名相匹配,使用
[
]
之间的字符(包括换行符)作为字符类。)

这不是
apt get
的东西,这是shell的东西

正如@rici所说,如果您正在执行赋值,那么
[]
符号将用于修改数组元素。但你不是,所以不是

这是globbing的一部分,也称为通配符或文件名扩展。
[]
括号表示法称为字符类,是与文件名中的一个字符匹配的可选字符的范围或列表。例如,
[123]
表示“1”或“2”或“3”,也可以写成
[1-3]

globbing的问题是(在bash中)找不到与模式匹配的文件意味着文本作为命令传递。假设当前目录中没有名为
apt[\n]
的文件,它将尝试以该名称执行程序!(
\n
是新行字符的常用表示法)

下面是一个示例测试脚本:

# Let's create some files
touch apt1 apt2 apt3

# Let's see the expansion
set -x

apt[
]

apt[
123
]
以下是结果,
+
是xtrace(set-x)给出的提示(
PS4
):

因此,对于第一个,它正在寻找具有这种模式的文件

+ apt1 apt2 apt3
gash.sh: line 14: apt1: command not found
但是对于第二个文件,
\n
被视为空白,并且与文件名匹配
apt1
不是
$PATH
中的脚本,因此它找不到作为命令的脚本。
您会注意到它已扩展到所有匹配的文件名,而不仅仅是一个。

不相关,您应该能够使用
apt install
。。。而不是
apt get install
…“如果后面没有=则该单词不是数组赋值,因此它按字面意义被视为单词。”-仅当没有匹配时filenames@cdarke:没错;文件名扩展发生在分词之后。我想“字面上”这个词选得不好。但是,除非在这种非常特殊的情况下,如果您想在字符类中添加换行符以替换路径名,您需要引用它。
+ apt1 apt2 apt3
gash.sh: line 14: apt1: command not found