Страница 1 из 1

Подстановка в awk print $*

Добавлено: 31 авг 2018, 16:31
root
Есть конструкция типо такой:

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

declare -a settings
for i in {1..11}; do
    print_number="\$$[i+3]"
    settings[$i]="$(бла-бла-бла-неважно | awk -F ',' '{print $print_number}')"
done
т.е. в принт по идеи должно прилетать $4, $5, $6 и т.д., но он почему-то это не воспринимает.

Вопрос 1: почему?
Вопрос 2: существует ли способ заставить понимать?

Подстановка в awk print $*

Добавлено: 31 авг 2018, 16:43
Chocobo
root писал(а):
31 авг 2018, 16:31
в принт по идеи должно прилетать $4, $5, $6
не должно, как минимум в данном примере он не будет интерпертировать $ в одинарных кавычках.
Вот простой пример
Снимок экрана от 2018-08-31 16-42-56.png

Подстановка в awk print $*

Добавлено: 31 авг 2018, 16:50
root
Chocobo, это при условии, что там $1 и т.д. - переменные. Интересно, что они содержат? Лично я её воспринимаю конкретно в данном случаи (print в awk) как управляющую конструкцию, а не переменную.

Фигню написал, я тебя понял.

Подстановка в awk print $*

Добавлено: 31 авг 2018, 17:07
Chocobo
не суть, на самом деле при ''$something' будет сохранено именно как строка $something.
т.е. в '{print $print_number}' будет пробовать так и обработать.
root писал(а):
31 авг 2018, 16:31
заставить понимать?

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

for i in {1..11}; do
     print_number="\$$[i+3]";
     settings[$i]="$(echo "раз,два,три,четыре,пять,\
     шесть,семь,восемь,девять,десять,одиннадцать, \
     двенадцать, тринадцать, четрынадцать, пятнадцать." | awk -F "," "{print $print_number}")"; 
done
в $print_number попадут

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

$4
$5
$6
$7
$8
$9
$10
$11
$12
$13
$14
а в массив settings сами подстроки

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

chocobo@desktop:~$ echo ${settings[@]}
четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четрынадцать

Подстановка в awk print $*

Добавлено: 31 авг 2018, 17:18
root
Chocobo, логично, спасибо :thumbs:

Подстановка в awk print $*

Добавлено: 31 авг 2018, 17:27
Chocobo
Ну а я в свою очередь глядя на
settings[$i]="$(echo "раз,два,три,четыре,пять"| awk -F "," "{print $print_number}")"

Не особо пока понимаю почему оно коррректно работает без экранирований. :-D
Может вечер пятницы уже замылили взгляд, но пока не допираю)

Подстановка в awk print $*

Добавлено: 31 авг 2018, 19:14
root
Chocobo, он встречает | и считает, что "раз,два,три,четыре,пять" - здесь кавычки для echo. "$( )" - результат выполнения команды, ассоциируется с ``. дальше по коду понятно "," и "{print $print_number}"
P.S: хотя подсветку синтаксиса в xed эта логика, действительно сломала))

Подстановка в awk print $*

Добавлено: 31 авг 2018, 19:18
root
Chocobo, ыы)
2_montage.png

Подстановка в awk print $*

Добавлено: 31 авг 2018, 20:15
Chocobo
root писал(а):
31 авг 2018, 19:14
"$( )" - результат выполнения команды, ассоциируется с ``
Это думаю ты ему льстишь в интеллекте, что интерпретатор сам разрулит эту вложенность внутри кавычек :hoho: Надо бы проверить, баш - коварная штука)

Подстановка в awk print $*

Добавлено: 31 авг 2018, 20:34
Chocobo
http://www.gnu.org/software/bash/manual ... uotes.html
http://www.gnu.org/software/bash/manual ... uotes.html

И действительно он начинает интерпретировать выражение $() с момента открытия скобки. Внутри двойных кавчек тоже. Ты прав :)
Снимок экрана от 2018-08-31 20-36-22.png
Но выглядит это очень отстойно для чтения кода.
С одной стороны `` выглядят тут не хуже, но если привык к конструкциям $(), то чтоб не мешать их в одном скрипте - мы можем просто опустить внешние кавычки, они ж по факту тут нафиг не нужны :hoho: то есть
settings[$i]=$(echo "раз,два,три,четыре,пять"| awk -F "," "{print $print_number}") будет выглядеть уже не так кошмарно

Подстановка в awk print $*

Добавлено: 31 авг 2018, 21:13
root
Chocobo, как ты заметил
Chocobo писал(а):
31 авг 2018, 20:15
баш - коварная штука)
:-D
Хех, помню у меня прикол был, когда я долго ломал голову, почему же условие в скрипте не работает, вроде все логично. Психанул, переписал под простейшее условие такого вида: if [ 0 = 0 ]; then echo 1; fi. И все равно не работало! Сильно ж у меня тогда бомбило, благо догадался в libre запихать и посмотреть невидимые символы, действительно, перед then стаяла какая-то невидимая фигня. Занес в cherrytree :smile: Сверху неработающий код, снизу - работающий
one_montage.png
one_montage.png (9.56 КБ) 996 просмотров
:-D

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

Подстановка в awk print $*

Добавлено: 31 авг 2018, 21:55
Chocobo
root, А за сам алгоритм конструкции если продолжить. Что он делает в двух словах.
из исходной строки заполнить массив, только элементами начиная с 4 до 14. Может нафиг циклы и авк?

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

# Входные данные
string="раз,два,три,четыре,пять,шесть,семь,восемь,девять,десять,одиннадцать, двенадцать, тринадцать, четрынадцать, пятнадцать"

# Преобразование строки в массив по разделителю запятой
array=(${string//,/ })

# Выборка только интересующих элементов уже из массива (11 элементов, начиная с 4-го тут)
echo "${array[@]: 3:11}"
четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четрынадцать

Подстановка в awk print $*

Добавлено: 01 сен 2018, 05:06
root
Chocobo, пока что так не сращивает (хотя я знаю, что в приведенном ниже коде для скрипта для КМ "очистки метаданных через mat" есть какая-то ошибка в логике, кою я чуть позже исправлю), но пока что это выглядит так:
mat_montage.png
т.е. пока цикл используется еще и для подстановки параметров find по i-му элементу (точнее условие в цикле пусто, но планируется его так использовать).

Твой метод весьма интересен, нужно взять на заметку на будущее :thumbs:

Подстановка в awk print $*

Добавлено: 01 сен 2018, 07:06
Chocobo
root, с этого листинга не видно, чем является $settings_for_folders.
Ну да и ладно, тебе видней как оно там уместней, свои "бест практисес" навязывать не буду :hoho:

Подстановка в awk print $*

Добавлено: 01 сен 2018, 10:02
root
Chocobo, может и применю, скорее всего. Только я бы добавил так:
string_t=${string/раз,два,три,}
array=(${string_t//,/ })

чтобы не забивать лишними значениями)