声明不是有效的标识符bash

时间:2015-05-17 17:41:37

标签: bash variables for-loop sed declare

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

   for ((i=START;i<=END;i++)
declare var$i=$(something)
done

它有效,但现在我遇到了å,ä,ö等芬兰字符的问题。声明的内容是这样的

bash:declare 'wörd' not a valid identifier

如果我这样做的话,它可以正常工作

declare var2=$(sömething)

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

这样的变量
var$i

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

2 个答案:

答案 0 :(得分:6)

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"可以正常工作; shell declare获取参数时已经完成了shell的分词。

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

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

答案 1 :(得分:0)

尝试使用/bin/bash在命令行中运行脚本,而不是sh(:

而不是:

>> sh script.sh 

尝试:

>> /bin/bash script.sh