声明不是有效的标识符bash

jim*_*jim 5 variables bash for-loop sed declare

我的bash脚本有问题.我做的是分配这样的变量.

   for ((i=START;i<=END;i++)
declare var$i=$(something)
done
Run Code Online (Sandbox Code Playgroud)

它有效,但现在我遇到了å,ä,ö等芬兰字符的问题.宣称的是这样的

bash:declare 'wörd' not a valid identifier
Run Code Online (Sandbox Code Playgroud)

虽然我这样做但效果很好

declare var2=$(sömething)
Run Code Online (Sandbox Code Playgroud)

我可以用sed转换字符,但最好还是像往常一样,所以这是最后的解决方案.所以我想知道如何分配变量

var$i
Run Code Online (Sandbox Code Playgroud)

与芬兰人物.wörd这个词是我命令'something'输出的一部分.当有两个或更多单词时,只有包含字符ö,ä等的单词不会分配给变量,所以如果命令的输出是"某些东西",则唯一显示的是有回声是一回事.

che*_*ner 6

bash根本不允许使用AZ,az,0-9和_以外的字符的标识符.但是,您描述的错误只是该限制的副作用.declare是一个命令,它接受一个看起来像赋值语句的字符串参数,但语义略有不同.考虑这个命令:

foo () {
    echo "something wörd"
}
Run Code Online (Sandbox Code Playgroud)

在赋值语句中,右侧不会进行单词拆分,因此您不必引用命令替换.以下工作正常:

$ word3=$(foo)
$ echo "$word"
something wörd
Run Code Online (Sandbox Code Playgroud)

随着declare,然而,命令替换进行分词,所以当你写

$ i=3
$ declare word$i=$(foo)
Run Code Online (Sandbox Code Playgroud)

它等同于命令

$ declare word3=something wörd
Run Code Online (Sandbox Code Playgroud)

它传递两个名称declare来创建,word3(获取一个值)和wörd(这是一个无效的名称).declare word3="something wörd"会工作得很好; shell的分词已经在declare获得参数的时候完成了.

declare,那么,就需要以引用命令替换(或整个字符串),用于整个输出到作为新变量的值进行处理.

$ i=3
$ declare "word$i=$(foo)"
$ echo "$word3"
something wörd
Run Code Online (Sandbox Code Playgroud)

  • 关于将bash标识符限制为"[A-Za-z _] [A-Za-z0-9 _]*"的说法不正确.Bash允许标识符以当前语言环境中"isalpha"的任何单字节字符开头,并且继续使用任何字符是"isalnum".如果语言环境是iso-8859-1,那么斯堪的纳维亚语,法语,葡萄牙语和西班牙语字母就可以正常工作了.但是,它不适用于UTF-8语言环境,因为非us-ascii字母字符是多字节的. (2认同)