Страница 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
не должно, как минимум в данном примере он не будет интерпертировать $ в одинарных кавычках.
Вот простой пример
Подстановка в 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
попадут
а в массив
settings
сами подстроки
Код: Выделить всё
chocobo@desktop:~$ echo ${settings[@]}
четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четрынадцать
Подстановка в awk print $*
Добавлено: 31 авг 2018, 17:18
root
Chocobo, логично, спасибо

Подстановка в awk print $*
Добавлено: 31 авг 2018, 17:27
Chocobo
Ну а я в свою очередь глядя на
settings[$i]=
"$(echo
"раз,два,три,четыре,пять
"| awk -F
",
" "{print $print_number}
")
"
Не особо пока понимаю почему оно коррректно работает без экранирований.
Может вечер пятницы уже замылили взгляд, но пока не допираю)
Подстановка в awk print $*
Добавлено: 31 авг 2018, 19:14
root
Chocobo, он встречает | и считает, что "раз,два,три,четыре,пять" - здесь кавычки для echo. "$( )" - результат выполнения команды, ассоциируется с ``. дальше по коду понятно "," и "{print $print_number}"
P.S: хотя подсветку синтаксиса в xed эта логика, действительно сломала))
Подстановка в awk print $*
Добавлено: 31 авг 2018, 19:18
root
Подстановка в awk print $*
Добавлено: 31 авг 2018, 20:15
Chocobo
root писал(а): ↑31 авг 2018, 19:14
"$( )" - результат выполнения команды, ассоциируется с ``
Это думаю ты ему льстишь в интеллекте, что интерпретатор сам разрулит эту вложенность внутри кавычек

Надо бы проверить, баш - коварная штука)
Подстановка в 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
И действительно он начинает интерпретировать выражение
$()
с момента открытия скобки. Внутри двойных кавчек тоже. Ты прав
Но выглядит это очень отстойно для чтения кода.
С одной стороны
``
выглядят тут не хуже, но если привык к конструкциям
$()
, то чтоб не мешать их в одном скрипте - мы можем просто опустить внешние кавычки, они ж по факту тут нафиг не нужны

то есть
settings[$i]=$(echo "раз,два,три,четыре,пять"| awk -F "," "{print $print_number}")
будет выглядеть уже не так кошмарно
Подстановка в awk print $*
Добавлено: 31 авг 2018, 21:13
root
Chocobo, как ты заметил
Chocobo писал(а): ↑31 авг 2018, 20:15
баш - коварная штука)
Хех, помню у меня прикол был, когда я долго ломал голову, почему же условие в скрипте не работает, вроде все логично. Психанул, переписал под простейшее условие такого вида:
if [ 0 = 0 ]; then echo 1; fi
. И все равно не работало! Сильно ж у меня тогда бомбило, благо догадался в libre запихать и посмотреть невидимые символы, действительно, перед
then стаяла какая-то невидимая фигня. Занес в
cherrytree 
Сверху неработающий код, снизу - работающий

- one_montage.png (9.56 КБ) 996 просмотров
Но в целом, думаю, если попрактиковаться, подобные нюансы быстро отложатся в голове, и кучи проблем и вопросов возникать не будет)
Подстановка в 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" есть какая-то ошибка в логике, кою я чуть позже исправлю), но пока что это выглядит так:
т.е. пока цикл используется еще и для подстановки параметров find по i-му элементу (точнее условие в цикле пусто, но планируется его так использовать).
Твой метод весьма интересен, нужно взять на заметку на будущее

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

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