Русскоязычное сообщество Debian GNU/Linux

=> Обо всем! => Тема начата: СергейDebian от 07 июля 2018, 20:38:52

Название: Помогите разобрать задачку на Bash
Отправлено: СергейDebian от 07 июля 2018, 20:38:52
Мы рассказали, что можно проверить код возврата внешней программы прямо в конструкции if при помощи if `program options arguments` (действия внутри if выполнятся, если программа закончилась с кодом 0). Однако это не всегда правда! Если запуск внешней программы выводит что-то в stdout, то в проверку if поступит именно этот вывод, а не код возврата! Вы можете убедиться в этом, написав простой bash-скрипт с использованием, например, if `pwd`.


Однако как быть, если хочется всё-таки запустить программу program, которая пишет что-то в stdout и потом выполнить какие-то действия если ее код возврата равен 0? Выберите все верные утверждения или правильно работающие конструкции if.

Примечание: во всех вариантах ответов, где есть кавычка, используется именно косая кавычка (`), а не обычная (') или двойная (").

Тест — Выберите один или несколько вариантов из списка

1) if `program > some_file.txt`            Как понять это ворожение?
2)Сначала запустить program, затем if [[ $? -eq 0 ]]
3) Ничего сделать нельзя
4) Сначала var=`program`, затем if [[ $var -eq 0 ]]
5) if [[ `program` -eq 0 ]]
Название: Re: Помогите разобрать задачку на Bash
Отправлено: moreplavatel от 07 июля 2018, 22:14:57
а тебе о чем нибудь говорят такие выражения как функции, переменные, арифметические операторы, логическите операторы, циклы и т.д. ?
Название: Re: Помогите разобрать задачку на Bash
Отправлено: СергейDebian от 07 июля 2018, 22:17:45
да говорят.я даже знаю что это такое и какой синтаксис а пользоваться этим чтото не как не получается
Название: Re: Помогите разобрать задачку на Bash
Отправлено: moreplavatel от 07 июля 2018, 22:20:34
ну так нужно показывать примеры кода который ты пишешь.
тогда может и подскажут где ошибки.
Название: Re: Помогите разобрать задачку на Bash
Отправлено: СергейDebian от 07 июля 2018, 22:29:15
Пытаюсь проверить первое вырожение. что не так?

#!/bin/bash

if `prog.sh > some_file.txt `
then
echo "good"
else
echo "bad"
fi
Название: Re: Помогите разобрать задачку на Bash
Отправлено: moreplavatel от 08 июля 2018, 05:15:36
То что ты запускаешь действие в if вместо проверки, в if должна происходить только проверка на True, False.
Пример на существование файла.

True, файл существует, код 0:

[[ -f /etc/hosts ]]
kod=$?
echo "Код возврата $kod" > some_file.txt

if [[ $kod == 0 ]]; then
    echo "Правда, файл существует (True)"
else [[ $kod == 1 ]]
    echo "Ложь, файл не существует (False)"
fi


False, файл не существует, код 1:

[[ -f /etc/hostss ]]
kod=$?
echo "Код возврата $kod" > some_file.txt

if [[ $kod == 0 ]]; then
    echo "Правда, файл существует (True)"
else [[ $kod == 1 ]]
    echo "Ложь, файл не существует (False)"
fi


Цитата: СергейDebian от 07 июля 2018, 22:17:45
да говорят.я даже знаю что это такое и какой синтаксис а пользоваться этим чтото не как не получается

Какие языки программирования знаешь (php, может python )? Может на примере других языков будет понятнее.
Название: Re: Помогите разобрать задачку на Bash
Отправлено: СергейDebian от 08 июля 2018, 12:23:15
здравствуйте!

Разобрался наконец. вчера уже поздно было не ответил сразу.
я в этом куске не как не мог сообразит if `prog.sh > some_file.txt ` тут оказывается должна была указанна программа которая возвращает результат, и потом записывает его в some_file.txt. А я указал имя этого же скрипта который написал...
Название: Re: Помогите разобрать задачку на Bash
Отправлено: moreplavatel от 08 июля 2018, 12:39:08
Цитата: СергейDebian от 08 июля 2018, 12:23:15if `prog.sh > some_file.txt ` тут оказывается должна была указанна программа которая возвращает результат
я думал это очевидно  :)
Название: Re: Помогите разобрать задачку на Bash
Отправлено: СергейDebian от 08 июля 2018, 13:57:36
А ту как правильно сделать ?

Посмотрите на функцию из bash-скрипта:
counter ()  # takes one argument
{
  local let "c1+=$1"
  let "c2+=${1}*2"
}

Впишите в форму ниже строку, которую выведет на экран команда echo "counters are $c1 and $c2" если она находится в скрипте после десяти вызовов функции counter с параметрами сначала 1, затем 2, затем 3 и т.д., последний вызов с параметром 10.

я пишу так:

#!/bin/bash
i=0
c1=1
c2=1
for i in "seq 1 10";
do
counter ()
{
  local let "c1+=$1"
  let "c2+=${1}*2"
}
echo "counters sre $c1 and $c2"
done
Название: Re: Помогите разобрать задачку на Bash
Отправлено: ogost от 08 июля 2018, 14:45:21
Сергей, прячем все скрипты под тэг "код"!
Название: Re: Помогите разобрать задачку на Bash
Отправлено: moreplavatel от 08 июля 2018, 14:48:57
переменной i значение присваивать не нужно, в нее попадает счетчик.
пример:

for i in `seq 1 10`; do
    echo $i
done


обрати внимание на кавычки в моем примере и в твоем коде.
дальше даже смотреть не стал, я подумал что ты и правда знаешь синтаксис, но оказалось что ... .
читай книги по bash, смотри видосы на ютубе.
если бы у тебя был вопрос как что то конкретное реализовать (написать/исправить) то другое дело.
ну а так, пересказывать учебники, объяснять как работает цикл for - ни вижу смысла, в тырнете полно инфы и примеров.

ну или пиши так, если с кавычками путаешься.

for i in $(seq 1 10); do
    echo $i
done
Название: Re: Помогите разобрать задачку на Bash
Отправлено: СергейDebian от 08 июля 2018, 15:04:27
переписал как вы написали, результат выводится пустой..

как работает for я знаю.  выводит даже 10 раз но с1 и с2 пустые почемуто. не чего не считается
я так понимаю программа должна вывести на экран результат функции

Cообщение объединено 08 июля 2018, 15:35:59

скажите хоть как это выражение читается  let "c2+=${1}*2"
let производит арифметические операции над числами и переменными
переменной 2 присваивается и прибавляется это ${1}*2
А это   ${1} как правильно читается?

Cообщение объединено 08 июля 2018, 15:52:19

Если бы я все знал, наврятли бы стал задавать вопросы.