Новости:

Форуму исполнилось 12 лет!

Мы в матрице .
Мы в телеге .

Главное меню

Bash - разборки

Автор dZ0TFR, 07 декабря 2020, 12:49:42

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

dZ0TFR

Здесь я буду задавать вопросы в процессе обучения, если никто не против  :) Итак, первый вопрос:

Для чего двойные круглые скобки? Не доходит до меня ... С помощью их можно сравнивать только цифры (и цифровые значения переменных)? Или слова тоже? Если слова тоже, киньте пример.

Graf

Внутри круглых скобок вычисляются арифметические выражения и возвращается их результат. Так же они позволяют работать с переменными в стиле языка C.
Для сравнения строк, лучше использовать двойные квадратные скобки.

dZ0TFR

Ок). Значит арифметика и переменные. Просто хотел окончательно убедится что правильно понял написанное в талмуде. :drink_mini: Готовлю ещё вопросы :-)

dZ0TFR

А чем while от for отличается? То и то делают цикл. И зачем плодить одинаковые команды... Или есть существенные отличия?

bormant

Вот этим отличаются:
Цитировать
while list; do list; done
until list; do list; done
The while command continuously executes the do list as long as the last command in list returns an exit status of zero. The until command is identical to the while command, except that the test is negated; the do list is executed as long as the last command in list returns a non-zero exit status. The exit status of the while and until commands is the exit status of the last do list command executed, or zero if none was executed.
Цитировать
for name [ [ in [ word ... ] ] ; ] do list ; done
The list of words following in is expanded, generating a list of items. The variable name is set to each element of this list in turn, and list is executed each time. If the in word is omitted, the for command executes list once for each positional parameter that is set (see PARAMETERS below). The return status is the exit status of the last command that executes. If the expansion of the items following in results in an empty list, no commands are executed, and the return status is 0.
Цитировать
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
First, the arithmetic expression expr1 is evaluated according to the rules described below under ARITHMETIC EVALUATION. The arithmetic expression expr2 is then evaluated repeatedly until it evaluates to zero. Each time expr2 evaluates to a non-zero value, list is executed and the arithmetic expression expr3 is evaluated. If any expression is omitted, it behaves as if it evaluates to 1. The return value is the exit status of the last command in list that is executed, or false if any of the expressions is invalid.

dZ0TFR

Да я читал это, просто не улавливаю смысла, зачем использовать while, когда for кажется делает все то же самое и даже больше. Может попрактиковавшись до меня наконец дойдет...

bormant

Напишите с while:
for f in *.txz: do ... ; done
Напишите с for:
while read p; do ... ; done

Посмотрим, сравним, обсудим.

dZ0TFR

Ну сделал. Ну for завершается, а while висит на паузе. Получается ведут себя по-разному. Не знаю, может и for можно также заставить работать, практики пока нет.

UnixNoob

Посмотрите, например, уроки по с++ на канале Simple Code в youtube.
Цикл while и цикл for
Возможно станет понятнее. Думаю это можно применить к bash. Для меня while это в основном логические операции и условие "пока". А for ассоциируется с перебором чего-то.
Думаю с практикой вы поймете что и когда применяется, если есть реальные задачи конечно.

bormant

ЦитироватьНу сделал
И где? Выкладывайте, посмотрим, сравним, обсудим.

dZ0TFR

Я не понимаю, что должен делать ваш код, он выдавал ошибки, я делал свой:

#!/bin/bash

for f in *.txz
do
echo "Hello $f"

done


# ./test
ffmpeg-2.1.5-i486-1gv.txz
leafpad-0.8.18.1-i486-1gv.txz
unetbootin-585-i486-1rl.txz
wine-1.7.9-i486-1alien.txz


#!/bin/bash

var=5
while [ $var -gt 0 ]
do
echo "$var"
var=$[ $var - 1 ]
done


# ./test2
5
4
3
2
1


То и то делает цикл, только while я как понял работает только с цифрами, а for и с цифрами и со словами. Единственное что while умеет делать бесконечный цикл, даже не знаю где это может пригодится. Получается for лучше во всем и while - не нужен? Вот в чем был вопрос.



Graf

#11
Ты сделал совсем не то, о чём просил тебя bormant. :)
Второй вариант, ты вообще сам придумал. :)

Другими словами, попробуй свой же первый вариант реализовать через while.
Это возможно, но код будет гораздо больше.

Во-втором варианте от bormant идёт запрос со стандартного потока ввода ( считывает одну строку данных, пользовательский ввод) который передаётся переменной p, которую можно обработать.
Попробуй это реализовать через for.

dZ0TFR

Я еще просто не дошел до read :) Ладно, нужна или не нужна команда не мне решать. Не буду тормошить по пустякам. Постараюсь выкладывать действительно важные проблемы. Тему прошу не удалять, плз.

dZ0TFR

Обьясните, почему переменная $@ не начинает перебор в цикле for с самого начала (с опций -а -b -c и т.д), а начинает перебирать с последующих опции ( -f d -n) после предыдущего обрыва цикла while ?
cat 1
#!/bin/bash



while [ -n "$1" ]
do
case "$1" in
-a) echo "Option -a";;
-b) echo "Option -b";;
-c) echo "Option -c";;
-i) echo "Option -i";;
-f) echo "Option -f";;
-n) echo "Option -n";;
-g) echo "Option -g";;
-k) echo "Option -k";;
-m) echo "Option -m";;
-l) echo "Option -l";;
--) shift
break;;
*) echo "$1 not option" ;;
esac
shift


done

count=1
for param in $@
do
echo "parameter #$count: $param"
count=$[ $count + 1 ]
done


#./1 -a -b -c -f d -n -- -g -m -l -i  test1 test2 test3

dZ0TFR

У меня пока два предположения:
1) Второму циклу (который for) достанутся только остатки того, что было введено в командной строке и не было обработано while.
2) $@ настолько интеллектуален, что не работает с опциями, а работает только с параметрами.