涉及变量不起作用的Bash循环

时间:2014-05-29 11:59:37

标签: bash loops for-loop

我正在尝试编写这个简单的脚本,它使用ImageMagick将一堆.png图像转换为动画gif。我的文件名为firstNeighboursDistribution_strength_XXXbosons_13window_YYY.png,其中XXX = {0.0 0.001 0.0025 0.005 0.05 0.1 0.15},YYY = {1,3,5 ...}。以下代码不会在控制台上显示任何消息,它似乎卡住了。怎么了?

#$ -S /bin/bash 
LANG=C #Enforce English. Crucial to get decimal *points* (rather than commas)

for f in 0.0 0.001 0.0025 0.005 0.05 0.1 0.15;
do
convert -delay 400 -dispose Background +page firstNeighboursDistribution_strength_$fbosons_13window_*.png -loop 0 Animation_first_neigh_strength_$f.gif;
done

请注意以下代码按预期工作:

convert -delay 400 -dispose Background +page firstNeighboursDistribution_strength_XXXbosons_13window_*.png -loop 0 Animation_first_neigh_strength_$f.gif;

适用于任何合适的XXX。

3 个答案:

答案 0 :(得分:3)

您需要在变量名称周围加上大括号。 Bash不会尝试匹配变量,如果它找到一个$后跟一个有效的变量名,它就会使用它。因此,在您的代码中,Bash假定这是变量名称:

$fbosons_13window_

这是因为$*之间的每个字符都是有效的变量名字符。要解决此问题,您需要使用{}包围变量名称,以告诉bash确切的变量名称,如下所示:

${f}bosons_13window_

循环中的完整代码行是:

convert -delay 400 -dispose Background +page firstNeighboursDistribution_strength_${f}bosons_13window_*.png -loop 0 Animation_first_neigh_strength_$f.gif;

作为旁注,建议您将此变量用作字符串的一部分。大括号可以解决bash脚本中的许多微妙错误。

答案 1 :(得分:2)

这是因为$fSomething扩展了变量fSomething; f并连接Something

在变量{}周围使用大括号f

convert -delay 400 -dispose Background +page firstNeighboursDistribution_strength_${f}bosons_13window_*.png -loop 0 Animation_first_neigh_strength_${f}.gif;

答案 2 :(得分:1)

你的f变量应该像${f}bosnos