循环关联数组并将值用于其他操作?

时间:2015-11-12 21:17:52

标签: arrays bash loops imagemagick associative-array

第一次编写bash脚本。我只是通过stackoverflow问题找到了一些代理示例。

问题:如何组合声明为imagetable的声明{s =}}和调整大小脚本,以便它根据键值循环操作。

关联数组:

declare -A imagetable
imagetable=(
    ["custom-insights-laptop_1x.png"]   937x508
    ["custom-insights-laptop_2x.png"]   1874x1015
)

调整脚本大小

#!/bin/bash

#replace this -name value from imagetable
RETINA_IMAGES=`find . -name "custom-insights-laptop_1x.png"`

for retina_path in $RETINA_IMAGES
do
  target_path="${retina_path%.png}.png"

  #replace the -resize value from imagetable.
  convert -resize 937x508 $retina_path $target_path 

  echo "Converted ${retina_path} to ${target_path}"
done

2 个答案:

答案 0 :(得分:2)

我想我理解你的需要,但我不明白你的RETINA_IMAGES=$(find .. )

这对你有帮助。

declare -A imagetable
imagetable=(
    [custom-insights-laptop_1x.png]=937x508
    [custom-insights-laptop_2x.png]=1874x1015
)

for i in ${!imagetable[*]} ; do
   echo "#dbg: i = $i and \${imagetable[$i]}=${imagetable[$i]}"

   sz=${imagetable[$i]}
   convert -resize "${sz}" "$retina_path" "$target_path"
done

通过dbl引用变量的使用避免了整类shell脚本错误,就像我在转换行上所做的那样。

如果您需要进一步的帮助,请发表评论。

只需执行

即可学习很多关于关联数组的知识
echo ${!arr[*]} 
echo ${arr[*]}
echo ${#arr[*]}
echo ${arr[key]}

修改

所以更进一步,没有必要将文件名保存为RETINA_IMAGES(谢谢@MarkSetchell,我现在得到它; - )

尝试类似

的内容
fileTarget="custom-insights-laptop_1x.png"
find . -name "$fileTarget" \
| while read retina_path ; do
  target_path="${retina_path%.png}.png"

  #replace the -resize value from imagetable.
  convert -resize ${imagetable[$fileTarget]} $retina_path $target_path 

  echo "Converted ${retina_path} to ${target_path}"
done 

然后,您可以设置所有$ {!imagetable [*]}值的for循环,设置$fileTarget

IHTH

答案 1 :(得分:0)

我认为您只需要一些代码帮助,这看起来最简单,而且您不需要关联数组:

imgfile[0]="fileA.png"
imgfile[1]="fileB.png"
imgfile[2]="fileC.png"

for f in ${imgfile[@]}
do
    IMGSET=$(find . -name "$f")
    #other iterative code here
done