LINUX.ORG.RU

2
Всего сообщений: 24

Не работает цикл while, при наличии в нем обращения на другой хост

while read line
do
var=`ssh user@host 'command'`
echo $line
done < /home/file

При таком раскладе, скрипт отрабатывает идеально, но только один раз, на следующую итерацию не заходит.

Если убрать строку с ssh, то отрабатывает как надо и сколько нужно раз.

 , ,

kreiz ()

Как выйти из while в perl?

sub dungeon($name_dung){
	while($dung == "F"){
		print "Вы в $name_dung\n";
		&wasd;
		&monstr;
	}
}

 , , ,

derlinux ()

Пароль в переменной, а так же цикл запроса пароля

Не принимает пароль. Что я не так делаю?

read -p "Password: " passwd; gpg -o file --decrypt --batch --passphrase '$passwd' file.gpg
gpg: AES.CFB encrypted data
gpg: encrypted with 1 passphrase
gpg: decryption failed: Bad session key

Так же мне не понятно как правильно сделать цикл который будет переспрашивать пароль в случае неудачи? И что бы завершал цикл если расшифровка удалась.

 , ,

vachicul ()

Использование команды dig в цикле while в bash (вывести А-записи домена в файл txt)

Помогите, решить, пжл. Подскажите для самостоятельно изучения ресурсы по решения bash кейсов подобного рода, необходимые в работе админов!

 , , ,

PC122 ()

Bash не выходит из цикла WHILE

Всех приветствую! Помогите плиз. Нужен был скриптик для очистки места с сортировкой. скрипт проверяет место, если его нет, то запускается цикл WHILE ищутся файлы, сортируются удаляются, проверяется место, если мало продолжается цикл. После достижения нужного значения цикл должен прерываться. Но этого не происходит, скрипт уходит в бесконечный цикл. Помогите разобраться.

 
#!/bin/bash
cd /opt
i=`df -kP | grep "/dev/sdb1" | awk '{print $4}'`
echo "space for disk= $i KB"
while [[ $i -lt 1024000 ]]
do find /opt/ -name "*.log" -mtime +1 -and -type f | sort -r | tail -n1 | xargs -i rm '{}'
if [[ $i -eq 1024000 ]];
then
break
fi
done
echo "All DONE" 

Перемещено shell-script из linux-org-ru

 , ,

igorian1901 ()

Не могу разобраться в циклах

Есть программка которая циклично выводит обновляемые данные.

~$./prog
{
  "something Something": {
     "strings": [
        12.454398734,
        -32.39841032,
        88.382397873
      ]
   }
}
{
  "something Something": {
     "strings": [
        -34.12312344,
        555.12343442,
        -22.42342344
      ]
   }
}
^C
~$

Как во время обновления данных, сравнивать выводимые перед точкой значения с заданными числами например больше чем 100 и меньше чем -100 ?

Если бы команда prog выводила значение и завершалась, я бы видел это так:

check='sh prog'
for var in $check
do
if [ если одно из чисел перед точкой больше чем 100 или меньше чем -100 ]
then         
echo "Alert"
fi
done
Но переменная check ждёт вывода prog, но prog не может вернуться потому что зациклен. Так же мне не понятно, как сравнить числа с двойный набором условий?

 , , ,

WildUser ()

Не могу вспомнить название утилиты для циклического запуска скриптов

Подскажите пожалуйста команду которая запустит скрипт с N интервалом циклично. Только не говорите про while, я знаю что он есть.. Нужная программа открывала пустое окошко и вываливала результат скрипта через указанный интервал, сверху в этом окошке тикали часики. Помогите умоляю)

 , ,

WildUser ()

Обход «while true ; do pkill ssh ; done»

На уроках проги иногда когда нефиг делать у нас идет война. Раньше все было просто: ssh username@hostname, но теперь про ssh все знают и «защищаются от этого». Кто-то либо пишет в файл ~/.bashrc «pkill ssh». Я нашел способ как это обходить: ssh username@hostname [команда]. Это выполняет команду до выполнения файла .bashrc, но некоторые пишут «while true ; do pkill ssh ; done». Запускается цикл, блокирующий ssh. И моментальное выполнение не помогает. Есть ли способ обойти и это? Какой-то скрипт или команда? СРазу прошу не писать ничего по типу «Иди учи уроки»,«Делом занимайся на занятиях» и т.п. Я не бездельник, по проге я один из лучших, а такое я делаю редко, но это прикольно

 , , ,

vvediteima ()

Замена символа(числа) в файле на число с увеличением +1

Добрый день. Подскажите как заменить символ(число) в файле на число с увеличением +1, что-то типа:

i=0
for ((i++))
do sed -i 's/4097:0:1:[00-9]\|[00-9][00-9]:0:0:0:0:0:0:/4097:0:1:'$i':0:0:0:0:0:0:/g' file.txt
done

Что бы в файле, вместо

  • 4097:0:1:1:0:0:0:0:0:0:
  • 4097:0:1:3:0:0:0:0:0:0:
  • 4097:0:1:7:0:0:0:0:0:0:
  • 4097:0:1:5:0:0:0:0:0:0:
  • 4097:0:1:2:0:0:0:0:0:0:
  • 4097:0:1:1:0:0:0:0:0:0:
  • 4097:0:1:6:0:0:0:0:0:0:

было

  • 4097:0:1:1:0:0:0:0:0:0:
  • 4097:0:1:2:0:0:0:0:0:0:
  • 4097:0:1:3:0:0:0:0:0:0:
  • 4097:0:1:4:0:0:0:0:0:0:
  • 4097:0:1:5:0:0:0:0:0:0:
  • 4097:0:1:6:0:0:0:0:0:0:
  • 4097:0:1:7:0:0:0:0:0:0:

Заранее благодарен.

 , ,

valerka6969 ()

цикл в цикле или как получить то что хочу

Ситуация такая хочу из json дергать данные по скрипту и уже получать готовые данные

пробовал for in for, while in for, for in while, while in while. результата не дало

Очень простой пример

dns="yandex.ru mail.ru"
hosts="yandex mail"
hpath="$HOME/result"

echo "$(cat /dev/null > ${hpath})"

for n in $hosts; do
    echo $(echo $n >> ${hpath})
    for h in $dns; do 
        echo $(curl -I $h |grep 'Location\|Content-Length' >> ${hpath})
    done
done    

получаю либо такой вывод:

yandex
Location: https://yandex.ru/
Content-Length: 0
Location: https://mail.ru/
Content-Length: 185
mail
Location: https://yandex.ru/
Content-Length: 0
Location: https://mail.ru/
Content-Length: 185

либо после разных экспериментов, такой

yandex
Location: https://yandex.ru/
Content-Length: 0
mail
Location: https://yandex.ru/
Content-Length: 0
yandex
Location: https://mail.ru/
Content-Length: 185
mail
Location: https://mail.ru/
Content-Length: 185

хочу получить такой

yandex
Location: https://yandex.ru/
Content-Length: 0
mail
Location: https://mail.ru/
Content-Length: 185

Пример jsona

curl http://192.168.10.61:8085/data.json |jq '.Children[] | {CPU_temperature: .Children[1].Children[1].Children[] |select(.Text | contains("Core", "CPU Package")) |.Value}' |grep -v '{\|}' |tail -n1
curl http://192.168.10.71:8085/data.json |jq '.Children[] | {CPU_temperature: .Children[1].Children[1].Children[] |select(.Text | contains("Core", "CPU Package")) |.Value}' |grep -v '{\|}' |tail -n1

смысл в том чтобы вначале написать host или username а после уже вывод из json и так примерно по 6-7 курлов на каждый host

P.S. в списке будет больше значений, около 40 хостов

 , , , ,

testvtigercrm123 ()

while внутри while и fi

Соорудил небольшой цикл:

while true; do
{
if ... ; then
...
else
...
while ...; do ... done
...
fi
}					
done
Так вот он ругается на fi:
 Syntax error: "fi" unexpected (expecting "done")
но стоить закоментить цикл внутри else никаких ошибок нет. Если «while ...; do ... done» записать в файл /script.sh и запускать:
while true; do
{
if ... ; then
...
else
...
/script.sh
...
fi
}					
done
то тоже никаких проблем нет. Собственно так и соорудил временно. В чем косяк? Одним скриптом реально сделать?

 ,

Dimarius ()

Как построчно читать из GREP ?

нужно распарсить кучу файлов по маске, в цикле пробую

#!/bin/bash

while read LINE
    do
        echo 1
    done < grep CSQ *.err
ошибка syntax error near unexpected token `CSQ'

 ,

wolverin ()

Нечаянная загадка цикла while

while read -r d; do
        [[ -d $d ]] || {
                echo "$d is not a directory, skipping it" >&2
                continue
        }
        d=${d%%+(/)}
        info_ "Processing <<$d>>"
        { ssh ${remoteHost} "mkdir -p '$d'" && echo 'mkdir OK' >&2; } || echo 'mkdir FAIL' >&2
        rsync -a${flBeVerbose:+v} "${d}/" "${remoteHost}:${d}"

done < <(cat "$confDirList" | sed -r -e '/^\s*(#.*)?$/d' -e 's%\s*(#.*)$%%')

Есть вот такой цикл. В confDirList - путь до файлика с каталогами для синхронизации через перевод строки, либо "-", если нужно читать с STDIN. Целиком код этого скриптика здесь: https://pastebin.com/HbhWLWad

Внимание, вопрос: (какого) почему такое может быть, что если делать ssh в цикле, то цикл выполнится только один раз (и будет напечатано: «mkdir OK»), а если не делать ssh - то всё ОК, выполнится по количеству каталогов в confDirList'е. Каким образом использование ssh может привести к генерации признака EOF при чтении из потока в цикле while??

 , ,

DRVTiny ()

Добавить символы к строкам

В текстовом файле есть кучу доменов(строк), начинающихся с новой строки. Допустим файл здесь /home/man/result.txt

Ко всем им нужно добавить в конец имени ".error.log" - без кавычек.

Ужасно разбираюсь в регулярках и команде sed, поэтому прошу вас помочь мне.

Как это реализовать ? Мне важна сама комманда, которая добавит .error.log в конец имени строки

 , , , ,

gamble ()

Вопрос по циклам

Здравствуйте.

пункт 1. Есть текстовый файл, содержащий разные строки, где каждая начинается с новой строки.

пункт 2. Есть директория, содержащая файлы, где основная часть названия - повторяется парами, по двое; а конец названия как в примере ниже, то есть повторы идут через раз.

Пример:

  • hello.com.ua.access.list
  • hello.com.ua.error.log
  • donald.ru.access.list
  • donald.ru.error.log

... и т.д

Цель: применить комманду смены группы к каждому файлу из директории (пункт 2), но само название для смены группы берётся из текстового файла с самого начала (пункт 1), и только одно название должно быть для одной пары файлов, потом следующие название для следующей пары и т.д.

Пример:

  • chgrp lala hello.com.ua.access.list
  • chgrp lala hello.com.ua.error.log
  • chgrp gaga donald.ru.access.list
  • chgrp gaga donald.ru.error.log

... и т.д

Вопрос: я так понимаю, что это можно сделать двумя циклами через итерацию, но как это правильно реализовать ? Есть какие-то догадки ? Моя версия такова, но она не работает:

for i in $директория
do
while read line
do
chgrp $line $i
done < $текстовыйфайл
done
exit 0

 , , , ,

gamble ()

pipe и циклы ☛ непонятное поведение

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

Для начала создадим файл tst, состоящий из трёх строк:

for i in {a..c}; do echo $i >> tst; done

Читаем:

~$
>cat tst
a
b
c
Теперь считаем строки, ничего неожиданного:
~$
>a=0; while read; do ((++a)); echo $a; done < tst; echo "Всего строк "$a
1
2
3
Всего строк 3
А вот теперь неожиданность:
~$
>a=0; cat tst | while read; do ((++a)); echo $a; done; echo "Всего строк "$a
1
2
3
Всего строк 0
(В цикле «for in *...» всё то же самое)

Вопрос: Почему переменная «a» после завершения цикла не сохраняет своё значение, что я делаю не так?

Заранее благодарен за ответы!

P.S. Newbie

 , ,

Cave-Canem ()

Собственная замена i3status и бесконечный цикл в фоне на bash

Решил, что хочу свой собственный аналог i3status. Как я понимаю, i3bar взаимодействует с программой, которая указана в status_command, следующим образом: каждая новая строка вывода программы заменяет предыдущую в статусном пространстве i3bar, и каждая строка там висит, пока не будет заменена. Ну и всё это происходит, пока программа не завершится, поэтому нужен бесконечный цикл.

Попробовал банальщину:

while true
do 
date
sleep 3
done
Нормально работает, обновляется.

Я хочу такую структуру: есть одна строка, в которой фигурируют переменные, и эта строка выводится в бесконечном цикле каждые n секунд (это просто), и дополнительно ещё в нескольких бесконечных фоновых циклах должно происходить обновление переменных.

Как я это вижу:

while true
do
VAR1=...
sleep 600
done &

while true
do
VAR2=...
sleep 60
done &

while true
do
VAR3=...
sleep 5
done &

while true
do
echo $VAR1 $VAR2 $VAR3
sleep 5
done
Таким образом, каждую переменную можно будет обновлять с такой частотой, с которой нужно, независимо от остальных. Айпи, например, раз в 15 минут, кол-во апдейтов — раз в час и так далее, ну а выводить всё, что есть, с какой-нибудь достаточно большой частотой, не обновляя при этом все значения сразу.

Но почему-то такая идея не сработала - переменная пустой получается. Вот буквально так и попробовал в командной строке:

while true
do
myvar="$(date)"
sleep 5
done &
echo $myvar #несколько раз через некоторое время
Если пробую export myvar=«$(date)», то результат такой же. Пожалуйста, подскажите, что я делаю не так, и как надо на самом деле.

И ещё: Мб кто-нибудь в курсе, как именно в этом юзкейсе (статусная строка i3bar) получать всегда актуальное время, т.е. чтобы у меня минута на часах менялась не с задержкой в несколько секунд, а в соответствии с реальным ходом часов? Заранее спасибо.

 , , ,

Norong ()

Простая программа в С, проблема с while loop и input

Добрый день!

Пожалуйста, посмотрите небольшую программу. Я новичок, поэтому прошу снисходительности и помощи.

Задание было следующее: предположим, что количество воды, затраченное в течение одной минуты, проведенной под душем, эквивалентно 12 бутылкам воды. Цель программы запросить пользователя ввести количество минут, которые он/она проводит в душе и выдать количество бутылок воды.

Используются допущения: не проверять на положительные - отрицательные числа (правда я знак добавила). Если вводятся числа, то программа выдает количество бутылок. Если вводится слово (например, foo или 123abc), то программа должна снова ожидать ввод данных.

С последним у меня проблема. Если вводится foo или 123abc, то программа выдает 0. То есть с одной стороны, неверные значения не принимаются, но и запрос на новый ввод тоже не происходит. Вот тест:

reject "foo" minutes
   \ expected prompt for input, not exit code of 0 
 rejects "123abc" minutes
   \ expected prompt for input, not exit code of 0
То есть выдает такой результат: foo 0 Пожалуйста, помогите разобраться.
#include <stdio.h>
#include <ctype.h>

#define MAX 5000
#define BOTTLES_PER_MINUTE 12
int minutes[MAX];

void get_minutes(int minutes[]);
int char_to_digit(int minutes[]);

int main(void)
{
    printf("Please, enter the number of minutes\n");
    get_minutes(minutes);
    
    printf("%d\n", (char_to_digit(minutes) * BOTTLES_PER_MINUTE));
    
    return 0;
}
/* get minutes from the user, fill in the array */
void get_minutes(int minutes[])
{
    int i = 0;
    int c;
    
    while (!isspace(c = getchar()))
    {
        if (isalpha(c))
        {
            continue;
        }
        else
        {
            minutes[i] = c;
            i++;
        }
    }
    
    minutes[i] = '\0';
    
}
/*convert input into digits */
int char_to_digit(int minutes[])
{
    int i = 0;
    int n, sign;
    
    sign = (minutes[i] == '-')? -1: 1;
    if (minutes[i] == '-' || minutes[i] == '+')
    {
        i++;
    }
    
    for (n = 0; minutes[i] != '\0'; i++)
    {
        n = 10 * n + (minutes[i] - '0');
    }
    
    return sign * n;
}

Перемещено beastie из general

 , ,

Ducol ()

Все виды условий цикла while в bash'е

Сабж. Где глянуть? На tldp.org есть только для if.

Плохо искал. Ответ: Bash Conditional Expressions. Как было сказано в комментариях, обрабатываются эти условия встроенными командами баша '[[' и 'test' а while'у уже передается логическое значение, как я понял.

 , , ,

foodfast ()

цикл в баш.

собственно такой вот быдлокод:

#!/bin/bash
zlo=/home/user/FILE.dat
while read line;
        do
        kod=`cut -c 4-16 "$line"`
        gorod=`cut -c 190-224 "$line"`
        echo "$kod"XXXX"$gorod"
        done < $zlo
Где ошибка. У меня вообще ничего не парсится.
Спасибо.

 ,

dada ()