Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux &引用;无效的算术运算符“;壳内_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux &引用;无效的算术运算符“;壳内

Linux &引用;无效的算术运算符“;壳内,linux,bash,shell,unix,Linux,Bash,Shell,Unix,cat test.sh #!/bin/bash key="index"; arr[$key]="val" echo ${arr[${key}]} /bin/bash-x test.sh + key=index + arr[$key]=val + echo val val + key=index.index + arr[$key]=val test.sh: line 3: index.index: syntax error: invalid arithmetic operator (error

cat test.sh

#!/bin/bash
key="index";
arr[$key]="val"
echo ${arr[${key}]}
/bin/bash-x test.sh

+ key=index
+ arr[$key]=val
+ echo val
val
+ key=index.index
+ arr[$key]=val
test.sh: line 3: index.index: syntax error: invalid arithmetic operator (error token is ".index")
test.sh: line 4: index.index: syntax error: invalid arithmetic operator (error token is ".index")
然后我修改test.sh:

#!/bin/bash
key="index.index";
arr[$key]="val"
echo ${arr[${key}]}
/bin/bash-x test.sh

+ key=index
+ arr[$key]=val
+ echo val
val
+ key=index.index
+ arr[$key]=val
test.sh: line 3: index.index: syntax error: invalid arithmetic operator (error token is ".index")
test.sh: line 4: index.index: syntax error: invalid arithmetic operator (error token is ".index")

为什么会出现此错误,请提供任何建议

将数组变量声明为与
Declare-A arr
关联的数组

$ cat test.sh 
#!/bin/bash
set -x 
declare -A arr
key="index.index";
arr["$key"]="val"
echo "${arr["${key}"]}"

$ ./test.sh 
+ declare -A arr
+ key=index.index
+ arr["$key"]=val
+ echo val
val

此行为因BASH版本而异。较旧的BASH版本只允许非负整数作为数组中的键

请注意,BASH中的变量名中不允许使用
dot/period

有关BASH中允许的字符的更多详细信息,请参阅本问答:

编辑:

(非常感谢@chepner提供本附录)

规则数组(非关联数组)仅按整数索引。任何用作方括号之间索引的表达式都被视为算术表达式$键扩展为索引,然后将其视为(unset)变量,该变量扩展为0。如果为索引指定了一个值,例如3,则
${array[$key]}->${array[index]}->${array[3]}
。这是一种隐式间接参数扩展

如下:

key="index";
arr[$key]="val"
echo ${arr[${key}]}
这似乎只起作用。由于
arr
是一个普通数组,而不是关联数组,因此只能通过非负整数值对其进行索引

请考虑以下有效代码:

index=42
key="index"
arr[$key]="val"
echo ${arr[42]}
echo ${arr[index]}
echo ${arr[$index]}
echo ${arr['index']}
echo ${arr["index"]}
echo ${arr[\index]}
所有的
echo
语句都打印
val
。由于索引被视为算术表达式,因此它可以引用带有或不带前缀的变量(在本例中为
$index
),即使它是带引号的字符串也是如此

在您的代码中,如果您从未为
$index
赋值,
${arr[${key}}}
扩展为
${arr[index]}
,这相当于
${arr[$index]}
,默认情况下,它被视为等同于
${arr[0]}

(如果您有
set-o nounset
,那么对未设置变量的引用将被视为错误,您的代码将生成错误消息。)

您的第二段代码:

key="index.index";
arr[$key]="val"
echo ${arr[${key}]}
无效,因为
index.index
不是一个有效的变量名,即使您可能想让它只是一个用作数组索引的字符串

如果希望
arr
允许任意字符串作为索引,则它需要是关联数组。您可以通过简单地为非关联数组赋值(或使用
declare-a
)来创建非关联数组,但只能使用
declare-a
创建关联数组

在版本4中,关联数组被添加到bash中。如果您使用的是早期版本的bash,
declare-A
不受支持。您需要升级到更新的bash,编写一些笨拙的替代代码,或者使用支持关联数组的语言,如Awk、Python或Perl

添加
declare-arr
(如建议)应该可以解决问题(如果您有bash4),但是了解您的原始代码实际在做什么(或者更确切地说没有做什么)很有帮助


(顺便说一句,谢谢你问这个问题;我在写这个答案时学到了很多。)

这也适用于关联数组吗?因为在
声明-A
数组时,它似乎可以工作。在
GNUBash,版本4.1.2
中,它对我不起作用。你有哪个BASH版本?我有
gnubash,版本4.2.25(1)-发行版(i686pc-linux-GNU)
。规则数组(非关联数组)仅按整数索引。任何用作方括号之间索引的表达式都被视为算术表达式
$key
扩展为
索引
,然后将其视为(未设置)变量,并扩展为0。如果为
index
指定了一个值,例如3,那么
${array[$key]}->${array[index]}->${array[3]}
。这是一种隐式间接参数展开;在版本4中,关联数组被添加到bash中。但是数组的键/索引中的
字符仍然没有什么特别之处。变量名必须是标识符,这意味着它们不能包含
。普通数组的索引必须是非负整数;
没有什么特别之处,它们不能包含除
\uu
以外的任何标点符号。关联数组的索引(仅存在于bash 4及更高版本中)可以是任意字符串;同样,
也没有什么特别之处。值得注意的是,以前,字符串“index”在用作索引时被视为未设置变量,因此计算结果为0。