为什么变量在循环中失去其价值

时间:2016-02-05 21:54:48

标签: bash shell

我试图在循环中使用循环变量。但似乎它在使用一次后失去了它的价值(可能是我的误解)。这是我的代码

for i in {2000..2014}
do
    echo “training  representation$i_by_$i and testing representation$1999_by_$i”
done

我希望输出应该是这样的 -

training representation2000_by_2000 and testing representation1999_by_2000

但实际输出是这样的 -

training representation2000 and testing representation1999_by_??

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

因为你在字符串周围使用了引号。字符不是shell的特殊字符,因此它被视为变量名称的一部分。但是没有名为i”的变量。

更改为字符串周围的ASCII双引号。此外,由于_可以是变量名,因此当变量后跟该字符(或任何其他可以在变量名中的字符)时,您需要使用${i};否则,它正在寻找名为$i_by_的变量。

最后,$1999被解释为$1(脚本的第一个参数)followed by 999 . To prevent that, you need to escape the $`。

for i in {2000..2014}
do
    echo "training  representation${i}_by_$i and testing representation\$1999_by_$i"
done

停止使用文字处理程序编辑程序。使用编程编辑器,它不会自动纠正您的报价。

答案 1 :(得分:2)

好吧,你错过了一些引号,你可以使用那种引号,但是当你在调用变量$i后添加_时,bash认为你正在调用另一个名为{{$i_by_的变量。 1}}。

尝试:

for i in {2000..2014}
do
    echo "training  representation"$i"_by_"$i"and testing representation1999_by_$i"
done

通过它,您可以打印5个对象,training representation$i_by_$iand testing representation1999_by_$i

获得所需的输出:

“training representation2000_by_2000and testing representation1999_by_2000”

此外,最后你有$1999,我误以为。

编辑:正如评论中所建议的那样,你也可以使用:

echo "training representation${i}_by_${i}and testing representation1999_by_${i}"

使用引号内的变量。

@Barmar:那些报价很好,问题不存在;我试过这两种方式并以同样的方式工作。