声明不是有效的bash标识符

声明不是有效的bash标识符,bash,variables,for-loop,sed,declare,Bash,Variables,For Loop,Sed,Declare,我的bash脚本有问题。我所做的就是像这样分配变量 for ((i=START;i<=END;i++) declare var$i=$(something) done 虽然我这样做很好 declare var2=$(sömething) 我可以用sed转换字符,但最好像往常一样使用它们,所以这是最后的解决方案。 我想知道如何分配变量,比如 var$i 和芬兰人的角色。 wörd单词是我命令“something”输出的一部分。当有两个或两个以上的单词时,只有包含字符ö、ä等的单词

我的bash脚本有问题。我所做的就是像这样分配变量

   for ((i=START;i<=END;i++)
declare var$i=$(something)
done
虽然我这样做很好

declare var2=$(sömething)
我可以用sed转换字符,但最好像往常一样使用它们,所以这是最后的解决方案。 我想知道如何分配变量,比如

var$i
和芬兰人的角色。
wörd单词是我命令“something”输出的一部分。当有两个或两个以上的单词时,只有包含字符ö、ä等的单词没有分配给变量,因此如果命令的输出是“something wörd”,那么使用echo显示的唯一内容就是something。

bash
只允许使用A-Z、A-Z、0-9以外的字符的标识符,还有!。然而,您描述的错误只是该限制的副作用
declare
是一个命令,它接受一个看起来像赋值语句的字符串参数,但语义略有不同。考虑这个命令:

foo () {
    echo "something wörd"
}
在赋值语句中,右侧不进行分词,因此不必引用命令替换。以下工作很好:

$ word3=$(foo)
$ echo "$word"
something wörd
但是,使用
declare
,命令替换会进行分词,因此当您编写

$ i=3
$ declare word$i=$(foo)
这相当于命令

$ declare word3=something wörd
它为要创建的
declare
传递两个名称,
word3
(获取值)和
wörd
(无效名称)
declare word3=“something wörd”
可以正常工作;在
declare
获取参数时,shell的分词已经完成

使用
declare
,则需要引用命令替换(或整个字符串),以便将整个输出视为新变量的值

$ i=3
$ declare "word$i=$(foo)"
$ echo "$word3"
something wörd

如果
sh
(:

而不是:

>> sh script.sh 
尝试:


芬兰语字符是如何在
$i
中显示的?为什么要这样做?我将一些命令的输出分配给var1、var2,然后进行计算。很抱歉,我不知道你在第一部分的意思。
wörd
从何而来?看看
bash
标识符仅是ASCII码(a-z、a-z、0-9、41;由于非ASCII字符,裸
wörd=1
(不带
declare
)被解释为命令,而不是赋值语句。它可能会偏离POSIX规范,正如Cyrus提供的链接中所述,但它不会。有关bash标识符的声明仅限于
[A-Za-z_][A-Za-z0-9_]*
不正确。Bash允许标识符以当前区域设置中的任何单字节字符(
isalpha
)开头,并继续以任何字符(
isalnum
)开头。如果区域设置是iso-8859-1,那么斯堪的纳维亚语、法语、葡萄牙语和西班牙语字母就可以了。但是,它对U不起作用TF-8语言环境,因为非美国ascii字母字符是多字节的。谢谢。我知道当我键入答案的这一部分时,它听起来不必要地严格,但我不认为用非英语语言环境测试它。测试也不容易,因为现在大多数系统使用UTF-8控制台I/O,即使语言环境发生了变化。因此,您必须更改创建ISO-8859-1文件并设置区域设置。但老实说,它确实有效。(而且Posix也要求它有效。)要进一步理解@rici所说的,当您使用shell选项时,尤其是
set-o Posix
,可能会出现bash标识符问题。
>> sh script.sh 
>> /bin/bash script.sh