The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Bash: и снова работа с переменными"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Системное и пользовательское ПО / Linux)
Изначальное сообщение [ Отслеживать ]

"Bash: и снова работа с переменными"  +/
Сообщение от stakado email(ok) on 02-Апр-14, 08:46 
Здравствуйте!
Есть скрипт, в котором объявляются переменные. Задача - получить список переменных, объявленных в скрипте.
Вопрос на форуме я уже задавал и получил ответ (http://www.opennet.ru/openforum/vsluhforumID1/95498.html), но в дальнейших разработках появилась проблема. Итак, скрипт, в котором объявляются переменные и находятся их имена:
#!/bin/bash

BashVars=`set -o posix; set`
var1="111111"
var2="aaaaaa"
var3="zxczczx"
var4="$var1 asdas --$var2"
var5="zzzzzzzzzzzzzzzzzzz"

VarNames=`grep -vFe "$BashVars" <<<"$(set -o posix ; set)" | grep -v ^BashVars=`; unset BashVars
echo "$VarNames"
При исполнении скрипта вижу:
var1=111111
var2=aaaaaa
var3=zxczczx
var5=zzzzzzzzzzzzzzzzzzz

Вопрос: куда делась переменная $var4? Сдаётся, что ошибаюсь в какой-то мелочи, но вот найти где не могу уже второй день. Подскажите, пожалуйста, каким образом вывести на экран переменную $var4.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Bash: и снова работа с переменными"  +/
Сообщение от Pahanivo (ok) on 02-Апр-14, 10:31 
> Вопрос: куда делась переменная $var4? Сдаётся, что ошибаюсь в какой-то мелочи, но
> вот найти где не могу уже второй день. Подскажите, пожалуйста, каким
> образом вывести на экран переменную $var4.

не знаю, у меня никуда не делась ...

#!/bin/bash
var1="111111"
var2="aaaaaa"
var3="zxczczx"
var4="$var1 asdas --$var2"
var5="zzzzzzzzzzzzzzzzzzz"
BashVars=`set -o posix; set`
echo $BashVars

... var1=111111 var2=aaaaaa var3=zxczczx var4='111111 asdas --aaaaaa' var5=zzzzzzzzzzzzzzzzzzz ...

скорей всего когда сравниваются списки свой вклад вносят апострафы ... но разбираться в дальнейшей хрени типа:
VarNames=`grep -vFe "$BashVars" <<<"$(set -o posix ; set)" | grep -v ^BashVars=`; unset BashVars
чето желания нЭт )


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Bash: и снова работа с переменными"  +/
Сообщение от stakado email(ok) on 02-Апр-14, 10:47 
> скорей всего когда сравниваются списки свой вклад вносят апострафы ...

Вы правы, дело в апострофах. Меняю переменную var1="111111 sdfsdfs" и она из вывода скрипта тоже исчезает. При этом в простом выводе set переменные var1 и var4 отображаются в следующем виде:
var1='111111 sdfsdfs'
var2=aaaaaa
var3=zxczczx
var4='111111 sdfsdfs asdas --aaaaaa'

Т.е. переменные эти отсекаются при фильтрации переменных grep'ами.

> но разбираться в дальнейшей хрени типа:
> VarNames=`grep -vFe "$BashVars" <<<"$(set -o posix ; set)" | grep -v ^BashVars=`;
> unset BashVars
> чето желания нЭт )

Очень жаль :). Хрень эта почти полностью скопирована отсель: http://stackoverflow.com/questions/1305237/how-to-list-varia...

Может хоть какая маленькая мыслишка есть как бороться с апострофами? Я бы с удовольствием её развил. ;)

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Bash: и снова работа с переменными"  +/
Сообщение от Pahanivo (ok) on 02-Апр-14, 11:16 
> Т.е. переменные эти отсекаются при фильтрации переменных grep'ами.

тема ковычек и апострофов не так проста как кажется, особенно при конвеерной обработке
граблей пройдено не мало даже на этом форуме

> Очень жаль :). Хрень эта почти полностью скопирована отсель: http://stackoverflow.com/questions/1305237/how-to-list-varia...

копипаст без понимания бесполезен чуть больше, чем полностью

> Может хоть какая маленькая мыслишка есть как бороться с апострофами? Я бы
> с удовольствием её развил. ;)

1) для начала, надо сформулировать задачу полностью - какие данные имеем и что нужно получить, какие инструменты доступны
2) бороться можно както так "\", но опять же надо четко понимать где бороться и зачем

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Bash: и снова работа с переменными"  +/
Сообщение от stakado email(ok) on 02-Апр-14, 12:01 
> копипаст без понимания бесполезен чуть больше, чем полностью

На этом форуме не первый день, к Вашим репликам привык уже. Так что даже реагировать никак не стану ;).

> 1) для начала, надо сформулировать задачу полностью - какие данные имеем и
> что нужно получить, какие инструменты доступны
> 2) бороться можно както так "\", но опять же надо четко понимать где бороться и зачем

Проблему свою решил. Моя задача несколько отличается, от изначально описанной. Мне требуются лишь имена переменных, без их значений (но зная имена переменных вывести их значения не трудно). Не уверен, что _это_ кому-нибудь пригодится, но всё же решение проблемы принято описывать:
#!/bin/bash

BashVars=`set -o posix; set | awk -F = '{ print $1 }'`
var1="111111 sdfsdfs"
var2="aaaaaa"
var3="zxczczx"
var4="$var1 asdas --$var2"
var5="zzzzzzzzzzzzzzzzzzz"
var6="${var1} zxcxzcz"
var_7="adasdsdsad"

VarNames=`set -o posix; set | awk -F = '{ print $1 }' | grep -ve "^$BashVars$" | grep -v "BashVars"; unset BashVars`

echo $VarNames

Скрипт заносит в переменную VarNames имена всех переменных, инициализированных пользователем в скрипте.

P.S.: при этом, как написал выше, со скриптом воюю второй день. Вчера делал всё то же самое, что и сегодня. Но вчера не получалось, а сегодня вышло.

P.P.S.: ув. Pahanivo, спасибо за помощь! Ваши рассуждения натолкнули меня на верный путь.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Bash: и снова работа с переменными"  +/
Сообщение от Pahanivo (ok) on 02-Апр-14, 13:13 
> Скрипт заносит в переменную VarNames имена всех переменных, инициализированных пользователем
> в скрипте.

спорим что не всех )

BashVars=`set -o posix; set | awk -F = '{ print $1 }'`
var1="111111 sdfsdfs"
var2="aaaaaa"
var3="zxczczx"
unset var1
unset var3

var4="$var1 asdas --$var2"
var5="zzzzzzzzzzzzzzzzzzz"
var6="${var1} zxcxzcz"
var_7="adasdsdsad"

VarNames=`set -o posix; set | awk -F = '{ print $1 }' | grep -ve "^$BashVars$" | grep -v "BashVars"; unset BashVars`

echo $VarNames

try ))

> P.S.: при этом, как написал выше, со скриптом воюю второй день. Вчера
> делал всё то же самое, что и сегодня. Но вчера не
> получалось, а сегодня вышло.

сказать нечего, просто спою: естердэээй, ол май траблззз симс со фааааар эвэээй ...

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Bash: и снова работа с переменными"  +/
Сообщение от Andrey Mitrofanov on 02-Апр-14, 13:25 
> Очень жаль :). Хрень эта почти полностью скопирована отсель: http://stackoverflow.com/questions/1305237/how-to-list-varia...

Не оттуда копипастил же.

$ for c in `set|awk '{c=substr($0,1,1);if(c~/[_[:alpha:]]/&&!(c in x)){print c;x[c]=1}}'`; do eval "echo -n \"\${!$c*}\""; done

askubuntu.com/questions/275965/how-to-list-all-variables-names-and-their-current-values
$ for c in _ {a..z} {A..Z}; do eval "echo -n \"\${!$c*}\""; done

Гм, то же самое
$ compgen -v

Нужен список новых переменных или новых и _изменивших значение?

Со значениями вообще кудряво: обязательно сделай обработку многострочных занчений (см. свой же $BashVars или IFS какой). Ещё пара страниц^Wстрок awk-а и золотой ключик ваш.

> Может хоть какая маленькая мыслишка есть как бороться с апострофами? Я бы
> с удовольствием её развил. ;)

То есть значения всё-таки интересуют. :/ Ну, возьми ....  ???

env
printenv
    не подойдёт - это переменные окружения [процесса], _не_ переменные bash (разницу же все знают!)

declare -p
    ...вот его. Ещё "немного" awk-а или perl-а: многострочные зн., разные кавычки - у массивов, \-экранирование -- сущие мелочи.

Дерзай!

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

7. "Bash: и снова работа с переменными"  +/
Сообщение от Pahanivo (ok) on 03-Апр-14, 06:27 
Вот взял и так жестоко вынес мозг человеку.
А он то думал что у него все работает :)))
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Bash: и снова работа с переменными"  +/
Сообщение от startx1 on 03-Апр-14, 20:16 
> Вот взял и так жестоко вынес мозг человеку.
> А он то думал что у него все работает :)))

Господи, какой же жестокий этот баш о_0

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Bash: и снова работа с переменными"  +1 +/
Сообщение от pavlinux (ok) on 04-Апр-14, 03:13 
>> Вот взял и так жестоко вынес мозг человеку.
>> А он то думал что у него все работает :)))
> Господи, какой же жестокий этот баш о_0

Да не, это люди х...й занимаются.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Bash: и снова работа с переменными"  +/
Сообщение от Pahanivo (ok) on 04-Апр-14, 08:50 
> Да не, это люди х...й занимаются.

+1
довольно давно тут идет нарастающая лавина подобных постов
человеку "нужно сделать хрень", при этом он не понимает даже примерно как ему сделать эту "хрень", а самое главно не может объяснить зачем ему это надо :))
ЕГЭ работает короче :))

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Bash: и снова работа с переменными"  +/
Сообщение от pavlinux (ok) on 05-Апр-14, 03:10 
> ЕГЭ работает короче :))

Я вот сидел, думал, где бы эту фишу применить...
Дельного ничего не придумывается, точнее есть варианты,
но они из ряда параноидальной безопасности либо кроссшельные:
типа и на bash, и на csh, и на zsh, dash.

  


Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Bash: и снова работа с переменными"  +/
Сообщение от stakado email(ok) on 07-Апр-14, 07:47 
> Я вот сидел, думал, где бы эту фишу применить...
> Дельного ничего не придумывается, точнее есть варианты,
> но они из ряда параноидальной безопасности либо кроссшельные:
> типа и на bash, и на csh, и на zsh, dash.

Есть конфиг-скрипт 1.sh:
var1=zzz
var2=bbbb
...

Есть рядом другой скрипт, который читает этот конфиг (путем исполнения). Для дебага хочется вывести все переменные (с их значениями) на экран. Для этого, собственно, и заполняется массив имен переменных.

P.S.: ЕГЭ не сдавал, не было его ещё в то время.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Bash: и снова работа с переменными"  +/
Сообщение от Pahanivo (ok) on 07-Апр-14, 13:11 
оооо! мы очень рады что породив кучу вопросов вы таки решили вернуться к дисскусу ... ))
> Есть конфиг-скрипт 1.sh:
> var1=zzz
> var2=bbbb
> ...
> Есть рядом другой скрипт, который читает этот конфиг (путем исполнения). Для дебага
> хочется вывести все переменные (с их значениями) на экран. Для этого,
> собственно, и заполняется массив имен переменных.

да вот пацаны и спрашивают что за чудный способ дебага, именно в чем смысл, как вы это делаете и так понятно ))

> P.S.: ЕГЭ не сдавал, не было его ещё в то время.

меня тоже проперло - на нас просто аксперэмэнты ставили с углубленками и добавили сроку год ))


Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру