LINUX.ORG.RU

В чем подвох и как исправить?

Подвох в первой строчке скрипта.

Пиши скрипт под bash

#!/bin/bash
anonymous
()

А ещё лучше не используй 'echo' для подобных вещей,
есть printf(1,1p), а конкретно для управления терминалом tput(1).

ABW ★★★★★
()

Вместо \E можно написать ^[ (набирается как Ctrl-V ESC).

anonymous
()
Ответ на: комментарий от Kroz

В bash действительно заработало. Я только начинаю учить скрипты. Вот мое творение, которое рисует елочку) Если вам не трудно можете просмотреть и указать на «слабые» места. Буду благодарен.

 
#!/bin/bash
limit=9
count=3
clear
n=1
c=1
while [ $n -le $count ]
do
	i=1
	while [ $i -le $limit ]
	do
		str=""
		j=$((($n - 1)*(-6)))
		while [ $j -le $(($i*2)) ]
		do
			if ( [ $i -eq 3 ] && ( [ $j -le $((($n-1)*(-6) + 1)) ] || [ $j -ge  $(($i*2 - 1)) ] ) ) \
					|| ( [ $i -eq 4 ] &&  [ $j -ge $((($n-1)*(-6) + 3)) ] && [ $j -le  $(($i*2 - 3)) ] )
			then
				str=$str"\E[42;31m##"
			elif ( [ $i -eq 6 ] && ( [ $j -le $((($n-1)*(-6) + 2)) ] || [ $j -ge  $(($i*2 - 2)) ] ) ) \
							|| ( [ $i -eq 7 ] &&  [ $j -ge $((($n-1)*(-6) + 4)) ] && [ $j -le  $(($i*2 - 4)) ] )
			then
				str=$str"\E[42;34m##"
			elif  [ $i -eq $(expr $RANDOM % $limit) ] 
			then
				str=$str"\E[42;33mOO"
			else
				str=$str"\E[42;30m.."
			fi
			j=$(($j+1))
		done
		len=$(echo $str | wc -c)
		len=$(expr $len / 5)
		cols=$(tput cols)
		c_l=$(($cols-$len))
		new_cols=$(($(expr $c_l / 2)))
		tput cup $c $new_cols
		echo -e "$str" 
		i=$(($i+1))
		c=$(($c+1))
	done
	n=$(($n+1))
done		


imirrori
() автор топика
Ответ на: комментарий от imirrori

Пффф. Главный критерий: если работает, значит ок :)

Вот самый золотой мануал из всех, каких я видел (и не только по bash): http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Ок, вот парочка советов:

while [ $n -le $count ]

Возьми за привычку пользоваться [[...]] вместо [...] . Объяснение в мануале.

[ $i -le $limit ]

Не уверен применимо ли это к числам, но когда проверяешь строки, всегда бери обе переменные в двойные кавычки. Например
if [[ «$var1» -ne «$var2» ]] ; then
Это спасет от багов если в строках есть пробелы (точнее символы-разделители $IFS).

Остальное вроде ок.

Читай мануал, что я указал, тебе понравится :)

Kroz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.