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

Исходное сообщение
"Bash: и снова работа с переменными"

Отправлено stakado , 02-Апр-14 08:46 
Здравствуйте!
Есть скрипт, в котором объявляются переменные. Задача - получить список переменных, объявленных в скрипте.
Вопрос на форуме я уже задавал и получил ответ (http://www.opennet.me/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.


Содержание

Сообщения в этом обсуждении
"Bash: и снова работа с переменными"
Отправлено Pahanivo , 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
чето желания нЭт )



"Bash: и снова работа с переменными"
Отправлено stakado , 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...

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


"Bash: и снова работа с переменными"
Отправлено Pahanivo , 02-Апр-14 11:16 
> Т.е. переменные эти отсекаются при фильтрации переменных grep'ами.

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

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

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

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

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


"Bash: и снова работа с переменными"
Отправлено stakado , 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, спасибо за помощь! Ваши рассуждения натолкнули меня на верный путь.


"Bash: и снова работа с переменными"
Отправлено Pahanivo , 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.: при этом, как написал выше, со скриптом воюю второй день. Вчера
> делал всё то же самое, что и сегодня. Но вчера не
> получалось, а сегодня вышло.

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


"Bash: и снова работа с переменными"
Отправлено Andrey Mitrofanov , 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-а: многострочные зн., разные кавычки - у массивов, \-экранирование -- сущие мелочи.

Дерзай!


"Bash: и снова работа с переменными"
Отправлено Pahanivo , 03-Апр-14 06:27 
Вот взял и так жестоко вынес мозг человеку.
А он то думал что у него все работает :)))

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

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


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

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


"Bash: и снова работа с переменными"
Отправлено Pahanivo , 04-Апр-14 08:50 
> Да не, это люди х...й занимаются.

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


"Bash: и снова работа с переменными"
Отправлено pavlinux , 05-Апр-14 03:10 
> ЕГЭ работает короче :))

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

  



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

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

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

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


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

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

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

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