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