Bash (Проблемы, проблемки и вопросы.)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Bash

Сообщение Folderx »

Portnov писал(а):
13.01.2009 17:29
Не так давно эта тема всплывала. Дело в том, что код внутри while выполняется в sub-shell, и переменные из неё наружу не передаются.


Код: Выделить всё

[guest@station tmp]$ I=0;
[guest@station tmp]$ while [ $I -lt 3 ]; do ((I++)); done;
[guest@station tmp]$ echo $I
3
[guest@station tmp]$ I=0;
[guest@station tmp]$ echo none | while [ $I -lt 3 ]; do cat - >/dev/null; ((I++)); done;
[guest@station tmp]$ echo $I
0
[guest@station tmp]$

переменные создаются в канале
Спасибо сказали:
ukpyr
Сообщения: 2

Re: Bash

Сообщение ukpyr »

как передать строку с пробелами из переменной в команду без кавычек ?

FILES_IN="file1 file2 file3 file4"

command $FILES_IN

программа ругается на наличие кавычек.
при присваивании FILES_IN просто списка без кавычек ругается уже строка присваивания.

может можно использовать другой разделитель (напр. запятую) и как-то заменить запятые пробелами ?
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Bash

Сообщение Folderx »

как передать строку с пробелами из переменной в команду без кавычек ?

Код: Выделить всё

[guest@station tmp]$ echo "$IFS" | cat -et -
 ^I$ # тут пробел есть вначале
$
[guest@station tmp]$ S="one  two   three";
[guest@station tmp]$ echo $S
one two three
[guest@station tmp]$ ( IFS=0; echo $S; )
one  two   three
[guest@station tmp]$ echo "$IFS" | cat -et -
 ^I$ # тут пробел есть вначале
$
[guest@station tmp]$
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Хм натолкнулся на одну маленькую проблему. При запросе pl/sql вытягиваю суммы. Они представляют собой не целые числа, чаще всего в формате xx,yy. Интересует как же сравнивать такие числа. В c/c++ например всё просто, это был бы просто например тип float. А вот как на баше?
Например:
Есть Sum1=1,2 и Sum2=1
если сделать так:

Код: Выделить всё

a="1,2"
b="1"
if [ "$a" -ge "$b" ]; then
    echo "YES"
else
    echo "NO"
fi

тогда на выводе будет:

Код: Выделить всё

./0.sh: line 6: [: 1.2: integer expression expected
NO
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Bash

Сообщение Folderx »

как же сравнивать такие числа. В c/c++ например всё просто, это был бы просто например тип float.

Код: Выделить всё

[guest@station tmp]$ echo $N1 $N2
1,2 1
[guest@station tmp]$ RES=$(echo "${N1/,/.} >= ${N2/,/.}" | bc;);
[guest@station tmp]$ if [ $RES == "1" ]; then echo yes; else echo no; fi;
yes
[guest@station tmp]$ N1=0,5
[guest@station tmp]$ RES=$(echo "${N1/,/.} >= ${N2/,/.}" | bc;);
[guest@station tmp]$ if [ $RES == "1" ]; then echo yes; else echo no; fi;
no
[guest@station tmp]$
Спасибо сказали:
Aislin
Сообщения: 3
ОС: Mandriva

Re: Bash

Сообщение Aislin »

Подскажите, пожалуйста, как сделать простенький скрипт для вывода даты в кажлой строке лога при пинге.
Вот так:

Код:

64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=1 ttl=56 time=10.8 ms 22:11:08 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=2 ttl=56 time=10.1 ms 22:11:15 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=3 ttl=56 time=10.1 ms 22:11:22 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=1 ttl=56 time=12.6 ms 22:11:29 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=2 ttl=56 time=11.0 ms 22:11:36 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=3 ttl=56 time=10.9 ms 22:11:43 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=4 ttl=56 time=10.0 ms 22:11:50 64 bytes from charlie.hostmaster.net.ua (193.239.250.34): icmp_seq=5 ttl=56 time=12.5 ms 22:11:57

Пробывал такой скрипт, но ничего не получилось

Код:

ping='ping www.ua -c 10' thedate='date +"%r"' echo -n "$($thedate)" >> /home/aislin/Desktop/ping.txt echo "$($ping)" >> /home/aislin/Desktop/ping.txt
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Bash

Сообщение Folderx »

(Aislin) писал(а):для вывода даты в кажлой строке лога при пинге

Код: Выделить всё

[guest@station tmp]$ PATTERN="64 bytes from"; .ping station | sed "s/$PATTERN/$(Date;) $PATTERN/g"
PING station.domain (127.0.0.1) 56(84) bytes of data.
10.02.2009 64 bytes from station.domain (127.0.0.1): icmp_seq=1 ttl=64 time=0.028 ms
10.02.2009 64 bytes from station.domain (127.0.0.1): icmp_seq=2 ttl=64 time=0.031 ms
10.02.2009 64 bytes from station.domain (127.0.0.1): icmp_seq=3 ttl=64 time=0.027 ms
10.02.2009 64 bytes from station.domain (127.0.0.1): icmp_seq=4 ttl=64 time=0.028 ms
10.02.2009 64 bytes from station.domain (127.0.0.1): icmp_seq=5 ttl=64 time=0.027 ms

--- station.domain ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.027/0.028/0.031/0.003 ms
[guest@station tmp]$ declare -f Date
Date ()
{
    date +%d.%m.%Y;
    return 0
}
[guest@station tmp]$
Спасибо сказали: