Помогите разобрать задачку на Bash

Автор СергейDebian, 07 июля 2018, 20:38:52

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

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

СергейDebian

Мы рассказали, что можно проверить код возврата внешней программы прямо в конструкции 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 ]]

moreplavatel

а тебе о чем нибудь говорят такие выражения как функции, переменные, арифметические операторы, логическите операторы, циклы и т.д. ?

СергейDebian

да говорят.я даже знаю что это такое и какой синтаксис а пользоваться этим чтото не как не получается

moreplavatel

ну так нужно показывать примеры кода который ты пишешь.
тогда может и подскажут где ошибки.

СергейDebian

Пытаюсь проверить первое вырожение. что не так?

#!/bin/bash

if `prog.sh > some_file.txt `
then
echo "good"
else
echo "bad"
fi

moreplavatel

То что ты запускаешь действие в 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 )? Может на примере других языков будет понятнее.

СергейDebian

здравствуйте!

Разобрался наконец. вчера уже поздно было не ответил сразу.
я в этом куске не как не мог сообразит if `prog.sh > some_file.txt ` тут оказывается должна была указанна программа которая возвращает результат, и потом записывает его в some_file.txt. А я указал имя этого же скрипта который написал...

moreplavatel

Цитата: СергейDebian от 08 июля 2018, 12:23:15if `prog.sh > some_file.txt ` тут оказывается должна была указанна программа которая возвращает результат
я думал это очевидно  :)

СергейDebian

#8
А ту как правильно сделать ?

Посмотрите на функцию из 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


moreplavatel

#10
переменной i значение присваивать не нужно, в нее попадает счетчик.
пример:

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


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

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

for i in $(seq 1 10); do
    echo $i
done

СергейDebian

#11
переписал как вы написали, результат выводится пустой..

как работает 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

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