URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 42956
[ Назад ]

Исходное сообщение
"Надо присвоить переменной часть строки."

Отправлено dimabsd , 15-Апр-04 16:40 
Здраствуйте все.
Пишу скрипт в bash

#!/bin/bash

perem1=$1
На вход этой переменной подается строка '32130 1234 7563 2134345'.

Внимание вопрос!
Как можно присвоить perem2 значение 7563. (число через 2 пробела).

Т.е. из этой строки меня интересует только третье число.

Как быть?


Содержание

Сообщения в этом обсуждении
"Nado prisvoit' peremennoj chast' stroki."
Отправлено Brainbug , 15-Апр-04 16:57 
>Zdrastvujte vse.
>Pishu skript v bash
>
>#!/bin/bash
>
>perem1=$1
>Na vhod `etoj peremennoj podaetsya stroka '32130 1234 7563 2134345'.
>
>Vnimanie vopros!
>Kak mozhno prisvoit' perem2 znachenie 7563. (chislo cherez 2 probela).
>
>T.e. iz `etoj stroki menya interesuet tol'ko tret'e chislo.
>
>Kak byt'?

#!/bin/sh

perem1="32130 1234 7563 2134345"
perem2=`echo $perem1 | awk '{print $3}' - `

Na sh, no dumaju bash v etom plane ne budet olti4atca. Pri4em ne sovsem ponal. Nuzno 3 4islo v lubom slu4aje ili esli ono 3 i ego zna4enije 7563 ?


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 15-Апр-04 17:03 
Просто этот скрипт запускается при определенных условиях и когда условие выполняется на вход подается строка '32130 1234 7563 2134345' Которую я записываю в perem1, но из этой строки меня интересует только третье число.
Другими словами
>Nuzno 3 4islo v lubom slu4aje

Щас попробую
>perem2=`echo $perem1 | awk '{print $3}' - `
и отпишу 8-)


"Nado prisvoit' peremennoj chast' stroki."
Отправлено Brainbug , 15-Апр-04 17:15 
>Prosto `etot skript zapuskaetsya pri opredelennyh usloviyah i kogda uslovie vypolnyaetsya na
>vhod podaetsya stroka '32130 1234 7563 2134345' Kotoruyu ya zapisyvayu v
>perem1, no iz `etoj stroki menya interesuet tol'ko tret'e chislo.
>Drugimi slovami
>>Nuzno 3 4islo v lubom slu4aje
>
>SCHas poprobuyu
>>perem2=`echo $perem1 | awk '{print $3}' - `
>i otpishu 8-)


kstate kak s qmail'om re6il problemu ?


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 15-Апр-04 17:19 
>>SCHas poprobuyu
>>>perem2=`echo $perem1 | awk '{print $3}' - `
>>i otpishu 8-)
ZARABOTАЛО. Спасибо действительно помогло.
>
>kstate kak s qmail'om re6il problemu ?

QMAIL работает, проблема была в DNS сейчас её устранил все работает не могу не нарадоваться.


"Nado prisvoit' peremennoj chast' stroki."
Отправлено Brainbug , 15-Апр-04 17:22 
>>>SCHas poprobuyu
>>>>perem2=`echo $perem1 | awk '{print $3}' - `
>>>i otpishu 8-)
>ZARABOTALO. Spasibo dejstvitel'no pomoglo.
>>
>>kstate kak s qmail'om re6il problemu ?
>
>QMAIL rabotaet, problema byla v DNS sejchas eio ustranil vse rabotaet ne
>mogu ne naradovat'sya.

Rad sli6at. Uda4i.


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 16-Апр-04 12:23 
Сейчас другая проблема.(Bash)

Пишу условие на существование файла.
Мне нужна проверка условия, на существования файла, если файл существует то записать в файл 123, если не существует, то в файл 321.
В общем виде выглядит вот так:
#!/bin/bash

file1=qwerty

if [-e /home/user/${file1}.abc]; then    #ключ -e -проверка на #существование

echo ${file1} > /home/user/123           #если есть то запись в 123

fi

echo ${file1} > /home/user/321           #нет, то запись в 321

пробовал и с else, то же самое.

Файл /home/user/qwerty.abc - существует 100%.

Brainbug HELP 8-) !!!!


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 16-Апр-04 12:38 
>Сейчас другая проблема.(Bash)
>
>Пишу условие на существование файла.
>Brainbug HELP 8-) !!!!

Сделал.

if [ -e /home/user/${file1}.abc ]; then

Просто по не знанию не поставил пробелы после первой '[' и ']'
Смешная ошибка.


"Nado prisvoit' peremennoj chast' stroki."
Отправлено Brainbug , 16-Апр-04 13:07 
>Sejchas drugaya problema.(Bash)
>
>Pishu uslovie na suschestvovanie fajla.
>Mne nuzhna proverka usloviya, na suschestvovaniya fajla, esli fajl suschestvuet to zapisat'
>v fajl 123, esli ne suschestvuet, to v fajl 321.
>V obschem vide vyglyadit vot tak:
>#!/bin/bash
>
>file1=qwerty
>
>if [-e /home/user/${file1}.abc]; then    #klyuch -e -proverka na #suschestvovanie
>
>
>echo ${file1} > /home/user/123           #esli est' to zapis' v 123
>
>fi
>
>echo ${file1} > /home/user/321           #net, to zapis' v 321
>
>proboval i s else, to zhe samoe.
>
>Fajl /home/user/qwerty.abc - suschestvuet 100%.
>
>Brainbug HELP 8-) !!!!

Esli sravnit trebovanije i kod, to oni ne odinakovije. V dannom slu4aje esli fail su6estvujet, to zapis idet sna4ala v 123, a potom posle etogo v 321. A esli net to budet pisat tolko v 321.


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 16-Апр-04 15:09 
Спасибо

"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 16-Апр-04 17:47 
Как в Bash перевести переменную в которой содержиться строка '30482',
в число 30482.
Cкрипту на вход дается строка.
А мне нужно число.
Описание:
#!/bin/bash
user=$1      #Строка подаваемая на вход скрипта сохраняется в перем user.
perem1=`echo $perem1 | awk '{print $3}' - `#Выдираеися третий параметр в
                                      #строке и присваевается перем perem1
остальной код не изменился.
Вопрос как мне заставить переменную perem1 быть не строкой, а числом.
строчка подаваемая скрипту имеет такой вид:
qwerew 12312 30482 dsad asdfdf 3003213 2343545.
Из этой строчки выдираю 30482,
а арифметические действия с ней делать не могу.
Как быть?

"Nado prisvoit' peremennoj chast' stroki."
Отправлено PORT , 16-Апр-04 17:54 
>Как в Bash перевести переменную в которой содержиться строка '30482',
>в число 30482.
>Cкрипту на вход дается строка.
>А мне нужно число.
Tipi dannih razli4ajutca po kontekstu. Shell ne tipizirovanij jazik.


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 16-Апр-04 18:00 
>Tipi dannih razli4ajutca po kontekstu. Shell ne tipizirovanij jazik.
Выше описана моя ситуация.
Вы хотите сказать используя Bash ничего не получиться?


"Nado prisvoit' peremennoj chast' stroki."
Отправлено Brainbug , 16-Апр-04 18:07 
>>Tipi dannih razli4ajutca po kontekstu. Shell ne tipizirovanij jazik.
>Выше описана моя ситуация.
>Вы хотите сказать используя Bash ничего не получиться?

Ho4u skazat 4to skazhem a="1", budet vosprinimatca i kak stroka i kak 4islo v zavisimosti ot togo v kakom kontekste ono ispolzujetca. Esli skazhem budet arifmeti4eskaja operacija zna4it budet s4itat peremennuju a kak 4islo, budet operacii so strokami, zna4it budet a kak stroka ili kak simvol. Nikakih javnih preobrazovanij ne nado delat.


"Nado prisvoit' peremennoj chast' stroki."
Отправлено dimabsd , 16-Апр-04 18:12 
>Ho4u skazat 4to skazhem a="1", budet vosprinimatca i kak stroka i kak
>4islo v zavisimosti ot togo v kakom kontekste ono ispolzujetca. Esli
>skazhem budet arifmeti4eskaja operacija zna4it budet s4itat peremennuju a kak 4islo,
>budet operacii so strokami, zna4it budet a kak stroka ili kak
>simvol. Nikakih javnih preobrazovanij ne nado delat.

Описываю скрипт в котором производяться некоторые вычисления с цифрами.

#!/bin/bash
user=name                         #символы
perem1=3000                       #число
perem2=10000                      #число

Rezult=$[ $perem2 - $perem1 ]     #расчитываем разницу между этими  
                                  #переменными результат запоминаем
                                  #в Rezult.

if [ "$Rezult" -le "1" ]; then    #если Rezult <= 1, то

touch /home/user/$user.abc        #создаем файл с именем $user.abc
echo $perem2 $Rezult > /home/user/$user.abc
                                  #и записываем в него переменные
                                  #perem2 и Rezult.

else                              #иначе, записываем в файл
echo $Rezult > /home/user/Rezult  #/home/user/Rezult значение Rezult
fi

Все вычисления работают и записываются в файл результаты как и должно быть, но проблема в том, что у меня на вход скрипта подается строка из которой меня интересует третий параметр который я присваиваю переменной perem1. Затем произвожу вышеупомянутые действия.
Описание:
#!/bin/bash
user=$1      #Строка подаваемая на вход скрипта сохраняется в перем user.
perem1=`echo $user1 | awk '{print $3}' - `#Выдираеися третий параметр в
                                #строке и присваевается перем perem1
user1=`echo $user1 | awk '{print $11}'   `#Выдираеися 11-ый параметр в
                                #строке и присваевается перем user1

остальной код не изменился.
т.е вся разница в том, что в первом случае я переменным присваиваю значения в скрипте и все работает, а во втором (как мне надо) значения переменных выдираются из строки подаваемой на вход!
Вот такие изменения, а вычисления уже не выполняются.
Вот в чем проблема !


"Nado prisvoit' peremennoj chast' stroki."
Отправлено Brainbug , 16-Апр-04 18:36 
>>Ho4u skazat 4to skazhem a="1", budet vosprinimatca i kak stroka i kak
>>4islo v zavisimosti ot togo v kakom kontekste ono ispolzujetca. Esli
>>skazhem budet arifmeti4eskaja operacija zna4it budet s4itat peremennuju a kak 4islo,
>>budet operacii so strokami, zna4it budet a kak stroka ili kak
>>simvol. Nikakih javnih preobrazovanij ne nado delat.
>
>Описываю скрипт в котором производяться некоторые вычисления с цифрами.
>
>#!/bin/bash
>user=name            
>          
>  #символы
>perem1=3000            
>          
>#число
>perem2=10000            
>          #число
>
>
>Rezult=$[ $perem2 - $perem1 ]     #расчитываем разницу между
>этими
>            
>


Rezult=`expr $perem2 - $perem1` #V Bash ne znaju no v sh tak.

          
>          
>#переменными результат запоминаем
>            
>          
>          
>#в Rezult.
>
>if [ "$Rezult" -le "1" ]; then    #если Rezult
><= 1, то
>
>touch /home/user/$user.abc        #создаем файл с
>именем $user.abc
>echo $perem2 $Rezult > /home/user/$user.abc
>            
>          
>          
>#и записываем в него переменные
>            
>          
>          
>#perem2 и Rezult.
>
>else            
>          
>       #иначе, записываем в файл
>
>echo $Rezult > /home/user/Rezult  #/home/user/Rezult значение Rezult
>fi
>
>Все вычисления работают и записываются в файл результаты как и должно быть,
>но проблема в том, что у меня на вход скрипта подается
>строка из которой меня интересует третий параметр который я присваиваю переменной
>perem1. Затем произвожу вышеупомянутые действия.
>Описание:
>#!/bin/bash
>user=$1      #Строка подаваемая на вход скрипта сохраняется
>в перем user.
>perem1=`echo $user1 | awk '{print $3}' - `#Выдираеися третий параметр в
>            
>          
>         #строке и
>присваевается перем perem1
>user1=`echo $user1 | awk '{print $11}'   `#Выдираеися 11-ый параметр в
>
>            
>          
>         #строке и
>присваевается перем user1
>
>остальной код не изменился.
>т.е вся разница в том, что в первом случае я переменным присваиваю
>значения в скрипте и все работает, а во втором (как мне
>надо) значения переменных выдираются из строки подаваемой на вход!
>Вот такие изменения, а вычисления уже не выполняются.
>Вот в чем проблема !



"Надо присвоить переменной часть строки."
Отправлено Дмитрий Ю. Карпов , 17-Апр-04 07:38 
> perem1=$1
> На вход этой переменной подается строка '32130 1234 7563 2134345'.
> Как можно присвоить perem2 значение 7563. (число через 2 пробела).
> Т.е. из этой строки меня интересует только третье число.

Кажется, что-то типа $perem1[3] (т.е. каждая строка одновременно является массивом, где разделитель - пробельные символы, но можно установить другие). Операция `echo $perem1 | awk '{print $3}' - ` требует запуска двух процессов, что несколько накладно по времени.

> Мне нужна проверка условия, на существования файла

Там много вариантов - "-f" на то, что это действительно файл (а не директория); "-r" на то, что его можно читать и т.п.
А '[' (в отличие от "]") - это не скобка, а программа "/usr/bin/[", возвращающая код завершения (и это многое объясняет).

> как мне заставить переменную perem1 быть не строкой, а числом.

А как ты её используешь, что это не получается? В Shell AWK и Perl переменные не делятся на числовые и строчные.

> user1=`echo $user1 | awk '{print $11}'   `#Выдираеися 11-ый параметр в строке и присваевается перем user1

А ты проверь, что получается в результате. IMHO, AWK может воспринимать "$11" как "${1}1" (т.е. первый аргумент с подшитой к нему единицей), а не  как "${11}". В Shell рекомендуется все переменные брать в фигурные скобки.


"Надо присвоить переменной часть строки."
Отправлено vt , 17-Апр-04 10:40 
Весь топик - какая-то каша из basic-a и транслита
Ничего общего с shell-программированием это не имеет
Объясни внятно и уже до конца чего ты хочешь,
тогда можно будет что-нибудь посоветовать

"Надо присвоить переменной часть строки."
Отправлено dimabsd , 18-Апр-04 15:50 
>Весь топик - какая-то каша из basic-a и транслита
>Ничего общего с shell-программированием это не имеет
>Объясни внятно и уже до конца чего ты хочешь,
>тогда можно будет что-нибудь посоветовать

Сейчас попробую.

Мне нужно из значения переменной 'perem2' вычесть значение  переменной 'perem1' и результат присвоить третьей переменной 'Rezult'.
Затем мне нужна проверка условия:
Если значение третьей переменной меньше либо равно 1, то нужно создать файл с именем первой переменной 'User'(/home/user/test.lock ), иначе создать файл (к примеру /home/user/123 ) и записать в него значение третьей переменной 'Rezult'.
Я это делаю вот таким образом, то все работает.
#!/bin/bash
user=test                         #символы
perem1=3000                       #число
perem2=10000                      #число

Rezult=$[ $perem2 - $perem1 ]     #расчитываем разницу между этими  
                                  #переменными результат запоминаем
                                  #в Rezult.

if [ "$Rezult" -le "1" ]; then    #если Rezult <= 1, то

touch /home/user/$user.lock        #создаем файл с именем $user.lock
else                              #иначе, записываем в файл
echo $Rezult > /home/user/Rezult  #/home/user/123 значение Rezult
fi

Проблема в том, что это работает когда значения переменных 'User' и 'perem1' задаю в скрипте т.е.
user=test
perem1=3000
А у меня когда запускается скрипт в программе ему на вход подается строка

4342 123431 vasya  asdas 3423  321331

и мне надо чтобы значения переменных user и perem1 брались из третьего и пятого параметра строки, для этого я пишу вот так:
#!/bin/bash
stroka=$1           #значение переменной равно строке поданной на вход

user=`echo $stroka | awk '{print $3}' - `   #Выдираеися третий
                                            #параметр в строке и
                                            #присваевается user
              #т.е в данном случае значение пер-ой user=vasya.

perem1=`echo $stroka | awk '{print $5}' - `#Выдираеися пятый
                                           #параметр в строке и
                                           #присваевается perem1
              #т.е в данном случае значение пер-ой perem1=3423.
perem2=10000

Rezult=$[ $perem2 - $perem1 ]     #остальной код, как видите тот-же
                                  #проблема в том, что вычисления уже не
                                  #выполняются. Пробовал вместо проверки
if [ "$Rezult" -le "1" ]; then    #условия записывать значения переменных
                                  #user и perem1 в какой нибудь файл.
touch /home/user/$user.lock       #Эти значения были верные.  Тогда поче-
else                              #му когда явно задаешь значения все
echo $Rezult > /home/user/Rezult  #работает, а когда выдираешь из строки,
fi                                #нет.
Вот в чем проблема.
Помогите советом.


"Надо присвоить переменной часть строки."
Отправлено vt , 19-Апр-04 15:11 
$ cat script
#!/bin/sh
let r=10000-$5
test $r -le 1 && touch $3.lock || echo $r > result

$ ./script 4342 123431 vasya asdas 3423 321331

$ ./script 4342 123431 vasya asdas 13423 321331

$ ls
result  script*  vasya.lock

$ cat result
6577


"Надо присвоить переменной часть строки."
Отправлено vt , 19-Апр-04 15:29 
Более универсальный вариант

$ cat ./script
#!/bin/sh
set $@
let r=10000-$5
test $r -le 1 && touch $3.lock || echo $r > result

позволяет и так

$ ./script "4342 123431 vasya asdas 3423 321331"


"Надо присвоить переменной часть строки."
Отправлено Brainbug , 21-Апр-04 10:29 
>$ cat script
>#!/bin/sh
>let r=10000-$5
>test $r -le 1 && touch $3.lock || echo $r > result
>
>$ ./script 4342 123431 vasya asdas 3423 321331
>
>$ ./script 4342 123431 vasya asdas 13423 321331
>
>$ ls
>result  script*  vasya.lock
>
>$ cat result
>6577

Neverno.
йt script
#!/bin/sh
let r=1000-$1
echo $r
%./script 10
let: arith: syntax error: "r=1000-10"
%

Verno

йt script
#!/bin/sh
r=$((1000-$1))
echo $r
%./script 10
990
%

Eto v otno6enii sh. V bash let rabotajet.

%uname -rs
FreeBSD 4.9-RC



"Надо присвоить переменной часть строки."
Отправлено vt , 21-Апр-04 12:10 
>Neverno.
>йt script
>#!/bin/sh
>let r=1000-$1
>echo $r
>%./script 10
>let: arith: syntax error: "r=1000-10"
>%
>
>Verno
>
>йt script
>#!/bin/sh
>r=$((1000-$1))
>echo $r
>%./script 10
>990
>%
>
>Eto v otno6enii sh. V bash let rabotajet.
>
>%uname -rs
>FreeBSD 4.9-RC

Во-первых, читаем subj: "Пишу скрипт в bash"

Во-вторых, "верно"-"не верно" в соответствии с чем ?
$ sh --posix -c 'let a=1+2; echo $a'
3

А творчество создателей sh в "FreeBSD 4.9-RC",
оставим любителям этого творчества.


"Надо присвоить переменной часть строки."
Отправлено Дмитрий Ю. Карпов , 19-Апр-04 19:01 
> Эти значения были верные. Тогда почему когда явно задаешь значения
> все работает, а когда выдираешь из строки, нет.
Ответ очевиден - проверь, присваиваются ли переменным те значния, которые ты ожидаешь (т.е. после
user=`echo $stroka | awk '{print $3}' - `
сделай
echo '>'$user'<'
и посмотри глазками, что в эту переменную заносится (уголки дл ятого, чтобы видеть границы переменной).