Здравствуйте!
Есть скрипт, в котором объявляются переменные. Задача - получить список переменных, объявленных в скрипте.
Вопрос на форуме я уже задавал и получил ответ (http://www.opennet.me/openforum/vsluhforumID1/95498.html), но в дальнейших разработках появилась проблема. Итак, скрипт, в котором объявляются переменные и находятся их имена:
#!/bin/bashBashVars=`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.
> Вопрос: куда делась переменная $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
чето желания нЭт )
> скорей всего когда сравниваются списки свой вклад вносят апострафы ...Вы правы, дело в апострофах. Меняю переменную 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...
Может хоть какая маленькая мыслишка есть как бороться с апострофами? Я бы с удовольствием её развил. ;)
> Т.е. переменные эти отсекаются при фильтрации переменных grep'ами.тема ковычек и апострофов не так проста как кажется, особенно при конвеерной обработке
граблей пройдено не мало даже на этом форуме> Очень жаль :). Хрень эта почти полностью скопирована отсель: http://stackoverflow.com/questions/1305237/how-to-list-varia...
копипаст без понимания бесполезен чуть больше, чем полностью
> Может хоть какая маленькая мыслишка есть как бороться с апострофами? Я бы
> с удовольствием её развил. ;)1) для начала, надо сформулировать задачу полностью - какие данные имеем и что нужно получить, какие инструменты доступны
2) бороться можно както так "\", но опять же надо четко понимать где бороться и зачем
> копипаст без понимания бесполезен чуть больше, чем полностьюНа этом форуме не первый день, к Вашим репликам привык уже. Так что даже реагировать никак не стану ;).
> 1) для начала, надо сформулировать задачу полностью - какие данные имеем и
> что нужно получить, какие инструменты доступны
> 2) бороться можно както так "\", но опять же надо четко понимать где бороться и зачемПроблему свою решил. Моя задача несколько отличается, от изначально описанной. Мне требуются лишь имена переменных, без их значений (но зная имена переменных вывести их значения не трудно). Не уверен, что _это_ кому-нибудь пригодится, но всё же решение проблемы принято описывать:
#!/bin/bashBashVars=`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, спасибо за помощь! Ваши рассуждения натолкнули меня на верный путь.
> Скрипт заносит в переменную 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.: при этом, как написал выше, со скриптом воюю второй день. Вчера
> делал всё то же самое, что и сегодня. Но вчера не
> получалось, а сегодня вышло.сказать нечего, просто спою: естердэээй, ол май траблззз симс со фааааар эвэээй ...
> Очень жаль :). Хрень эта почти полностью скопирована отсель: 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-а: многострочные зн., разные кавычки - у массивов, \-экранирование -- сущие мелочи.Дерзай!
Вот взял и так жестоко вынес мозг человеку.
А он то думал что у него все работает :)))
> Вот взял и так жестоко вынес мозг человеку.
> А он то думал что у него все работает :)))Господи, какой же жестокий этот баш о_0
>> Вот взял и так жестоко вынес мозг человеку.
>> А он то думал что у него все работает :)))
> Господи, какой же жестокий этот баш о_0Да не, это люди х...й занимаются.
> Да не, это люди х...й занимаются.+1
довольно давно тут идет нарастающая лавина подобных постов
человеку "нужно сделать хрень", при этом он не понимает даже примерно как ему сделать эту "хрень", а самое главно не может объяснить зачем ему это надо :))
ЕГЭ работает короче :))
> ЕГЭ работает короче :))Я вот сидел, думал, где бы эту фишу применить...
Дельного ничего не придумывается, точнее есть варианты,
но они из ряда параноидальной безопасности либо кроссшельные:
типа и на bash, и на csh, и на zsh, dash.
> Я вот сидел, думал, где бы эту фишу применить...
> Дельного ничего не придумывается, точнее есть варианты,
> но они из ряда параноидальной безопасности либо кроссшельные:
> типа и на bash, и на csh, и на zsh, dash.Есть конфиг-скрипт 1.sh:
var1=zzz
var2=bbbb
...Есть рядом другой скрипт, который читает этот конфиг (путем исполнения). Для дебага хочется вывести все переменные (с их значениями) на экран. Для этого, собственно, и заполняется массив имен переменных.
P.S.: ЕГЭ не сдавал, не было его ещё в то время.
оооо! мы очень рады что породив кучу вопросов вы таки решили вернуться к дисскусу ... ))
> Есть конфиг-скрипт 1.sh:
> var1=zzz
> var2=bbbb
> ...
> Есть рядом другой скрипт, который читает этот конфиг (путем исполнения). Для дебага
> хочется вывести все переменные (с их значениями) на экран. Для этого,
> собственно, и заполняется массив имен переменных.да вот пацаны и спрашивают что за чудный способ дебага, именно в чем смысл, как вы это делаете и так понятно ))
> P.S.: ЕГЭ не сдавал, не было его ещё в то время.
меня тоже проперло - на нас просто аксперэмэнты ставили с углубленками и добавили сроку год ))