Първо, имай предвид, че има голяма разлика между различните кавички. В скрипта си написала единични кавички (тази, която е на клавиша с двойната кавичка; предполагам, че сама си ги вписала, иначе нямаше да се получи показаният отговор), а в случая става дума за единичната кавичка, намираща се в горния ляв ъгъл до клавиша 1 на клавиатурата. Докато обикновената единична кавичка огражда низ, който да се ползва такъв, какъвто е вписан (без четене на променливи или изпълнение на код между кавичките), другата единична кавичка се ползва за команда, която трябва да се изпълни между тези кавички. Освен това уважавай интервалите
Ето го скрипта с правилните кавички и обяснения кой ред какво прави:
GeSHi (Bash):
set 1 1 1 1 #задаване на безименен масив; все едно array=( 1 1 1 1 )
n=0 #задаване стойност 0 на $n
m=0 #задаване стойност 0 на $m
for br #цикъл, обхождащ последно зададения безименен масив; все едно for br in array
do
n=`expr $n + $br` #сумиране на $n и текущата стойност на $br
shift #изместване на масива с 1 позиция наляво; според мен нищо не прави в случая
if test $n -ne 1 #ако $n е различно от 1
then echo $n #принтиране стойността на $n
else m=`expr $m + 1` #сумиране на $m+1
echo $? #извеждане на статуса на изпълнение на последната команда (горния ред; може да е 0, 1 или 2)
fi
done
Shell има свойството да пази и безименни масиви и той се извиква в този for, за който няма зададено какво да се обхожда. Променливата $br не е обвързана с този масив. Тя само приема текущата стойност от масива при обхождането. Т.е., тъй като масива ни съдържа 4 единици, $br винаги е равно на 1.
Тъй като при първото завъртане на цикъла $n=1, първата стойност от изведения на екрана резултат е изхода от командата
expr $m + 1
Тъй като действието е изпълнено успешно, статусът на командата е 0, и затова първата стойност в общия резултат е 0. Ако предизвикаме грешка в изпълнението на командата на този ред, вместо 0 може да ни се изпише 1 (за нефатална грешка) или 2 (за фатална грешка). При следващите завъртания на цикъла $n не е равно на 1, така че просто се извежда стойността на $n, която се увеличава всеки път с едно, заради командата
expr $n + $br
където $br винаги е 1, тъй като само такива стойности имаме в масива.