2012-09-21 65 views
1

我正在編寫一個腳本來合併漫畫1110的xkcd webcomic瓷磚。到目前爲止,我已經寫了大約100行,而不是單獨執行每個圖像的象限,我決定使用函數來完成此操作,爲每個象限重複使用,並使用每個象限的變量來使該函數每次都有不同的行爲。我希望能夠做到這一點,除了每次使用不同的值。是否有可能有一個變量作爲for循環表達式?

a='((n=$north; n>=1; n--))'; 
for ${a}; 
    do "echo Hello World!" 
done 

我的問題是,我在使用變量的for循環表達式,它會「8號線:EVAL‘麻煩$ A’':不是一個有效的標識符」,如果我嘗試把它圓括號,它會變成「第30行:語法錯誤:算術表達式所需」,然後是「第30行:語法錯誤:((($ {a}))」。這是我迄今爲止所擁有的。在任何人回答之前,是的,我知道它有錯誤。

#!/bin/bash 
# Date Created: September 20th, 2012 
# Created by Jonathan Bondhus - https://github.com/jbondhus 
# Credit to Andreas Reichinger for analysis of image tile placement, xkcd.com for comic. Used ImageMagick code from Antonio Frascarelli. 
# 
# This script will merge the files from xkcd comic number 1110, "Click and Drag". 

function function_join() { 
    echo "#"; 
    if [[ quadrant -eq 1 ]]; then 
    echo "# First Quadrant:"; # Join together the first quadrant 
    function_quadrant 
    else 
     if [[ quadrant -eq 2 ]]; then 
     echo "# Second Quadrant:"; # Join together the second quadrant 
     function_quadrant 
     else 
      if [[ quadrant -eq 3 ]]; then 
      echo "# Third Quadrant:"; # Join together the third quadrant 
      function_quadrant 
      else 
       if [[ quadrant -eq 4 ]]; then 
       echo "# Fourth Quadrant:"; # Join together the fourth quadrant 
       function_quadrant 
       fi 
      fi 
     fi 
    fi 
    echo "#"; 
    for ${a}; 
    do 
     echo "# row number "$n" ..."; 
     convert $b; 
     for `eval "$c"`; 
     do 
      if [ $d ];  # If the tile file doesn't exist, an empty square will be used. 
       then convert $e; 
       else convert $f; 
      fi; 
     done; 
     convert $g; # Append the image onto the current quadrant 
     rm -f $h; 
     echo "# ... OK"; 
     echo "#"; 
    done; 
} 

function function_quadrant() { 
    if [[ quadrant -eq 1 ]]; then # Set the variables for function_join 
    quadrantName="first" 
    a='((n=$north; n>=1)); n--' 
    b='-size 0x1 xc:white resultn$n''w.png' 
    c='((w=$west; w>=1; w--))' 
    d='-e $n''n$w''w.png' 
    e='+append resultn$n''w.png $n''n$w''w.png resultn$n''w.png' 
    f='+append resultn$n''w.png _blank.png resultn$n''w.png' 
    g='-append ${quadrantName}Quadrant.png resultn$n''w.png ${quadrantName}Quadrant.png' 
    h='resultn$n''w.png' 
    else 
     if [[ quadrant -eq 2 ]]; then 
     quadrantName="second" 
     a='n=$north; n>=1; n--' 
     b='-size 0x1 xc:white resultn$n''e.png' 
     c='e=$east; e<=20; e++' 
     d='-e $n''n$e''e.png' 
     e='+append resultn$n''e.png $n''n$e''e.png resultn$n''e.png' 
     f='+append resultn$n''e.png _blank.png resultn$n''e.png' 
     g='-append ${quadrantName}Quadrant.png resultn$n''e.png ${quadrantName}Quadrant.png' 
     h='resultn$n''e.png' 
     else 
      if [[ quadrant -eq 3 ]]; then 
      quadrantName="third" 
      a='s=1; s<=$south; s++' 
      b='-size 0x1 xc:black results$s''w.png' 
      c='w=$west; w>=1; w--' 
      d='-e $s''s$w''w.png' 
      e='+append results$s''w.png $s''s$w''w.png results$s''w.png' 
      f='+append results$s''w.png _black.png results$s''w.png' 
      g='-append ${quadrantName}Quadrant.png results$s''w.png ${quadrantName}Quadrant.png' 
      h='results$s''w.png' 
      else 
       if [[ quadrant -eq 4 ]]; then 
       quadrantName="fourth" 
       a='s=1; s<=$south; s++' 
       b='-size 0x1 xc:black results$s''e.png' 
       c='e=1; e<=20; e++' 
       d='-e $s''s$e''e.png' 
       e='+append results$s''e.png $s''s$e''e.png results$s''e.png' 
       f='+append results$s''e.png _black.png results$s''e.png' 
       g='-append ${quadrantName}Quadrant.png results$s''e.png ${quadrantName}Quadrant.png' 
       h='results$s''e1.png' 
       else # If more than 4 quadrants, just to be safe, exit 
        exit 1 
       fi 
      fi 
     fi 
    fi 
} 

for ((quadrant = 0; quadrant < 4; quadrant++)); do 
    function_join 
done 

echo "#################################" 
echo "Joining completed!" 
echo "#################################" 

exit 0 
+0

不知道爲什麼你不首先使用'elif'或者更好的,'情況$ {}四)做的東西;;第二)做... ;; ... esac'。我不認爲你需要所有的縮進,只是使你難以跟隨你在做什麼。那說,有趣的問題,考慮在awk中重寫,偶爾調用像'cmd =「convert」opt1 opt2 opt3 ..;系統(cmd); ...'。祝你好運。 – shellter

回答

0

不怕。語法分析發生在參數擴展之前(參數需要首先被識別,畢竟)。我會建議重構您的代碼來傳遞數據,而不是可執行代碼。

+0

那你究竟在想什麼?寫出來非循環?或嵌套的if語句? –

1
./north.sh 
Hello World! 4 5 
Hello World! 3 4 
Hello World! 2 3 
Hello World! 1 2 
Hello World! 0 1 

貓north.sh

#!/bin/bash 
north=5; 
for ((n=$north; n>=1; --n)) 
do 
     ((north--)) 
    echo "Hello World! $north $n" 
done 
相關問題