Определение функций и использование карты в jq

Я думаю, что ваше определение bash неправильно определено в сценарии.

Выход:

-bash: 1: command not found

Обычно относится к плохо написанному определению bash, убедитесь, что оно определено следующим образом в первой строке скрипта:

#!/bin/bash

Если местоположение bash отличается, вы также можете найти его с помощью:

which bash
1
24.10.2021, 05:06
1 ответ

Резюме :Эти две функции и способ их вызова различаются тем, где происходит операция map()и что используется при сложении. Это имеет значение, так как в первом случае map()в вызове заставляет сложение в функции использовать первый элемент каждого отдельного вложенного массива -входного массива. Во втором случае map()выполняется внутри функции, а сложение использует весь первый подмассив -входного массива.


В первой функции

def addvalue(f):. + [f];

вы добавляете массив [f]к тому, что предполагается массивом во входном потоке. Добавление массива в другой массив приводит к добавлению новых элементов в массив.

Вы вызываете эту addvalue()функцию дважды, используя map(); один раз для каждого из массивов [1,2]и [10,20]. В первом вызове [f]будет [1], поэтому вы добавляете 1в качестве нового элемента в первый массив, получая [1,2,1]. Точно так же вы получаете [10,20,10]из второго вызова, когда [f]равно [10].

Добавление отладки в функцию,

def addvalue(f): debug |. + [f]

при вызове как в вопросе получаем следующее:

["DEBUG:",[1,2]]
["DEBUG:",[10,20]]

Это показывает, что функция вызывается дважды. Значение [f]будет равно [1]в первом вызове, что приведет к операции [1,2] + [1], дающей [1,2,1], и [10]во втором вызове, где [10,20] + [10]приведет к [10,20,10]. Операция map()в вызове объединит эти массивы в [[1,2,1],[10,20,10]].


В функции

def addvalue(f): f as $x | map(. + $x);

вы вызываете map()для того, что предполагается массивом во входном потоке. Для каждого элемента входного массива вы добавляете $xк этому элементу. Значение $x— это первый элемент массива.

Вы вызываете эту функцию один раз, используя массив [[1,2],[10,20]]в качестве входного массива и [1,2]в качестве аргумента. Для каждого из элементов входного массива, то есть для [1,2]и [10,20], вы добавляете[1,2](значение $x, первого элемента массива ). Добавление массива к другому массиву приводит к добавлению элементов массивов друг к другу, поэтому вы получаете [1,2,1,2]и [10,20,1,2]как два элемента результирующего массива.

Включение отладки во второй функции аналогично первой,

def addvalue(f): debug | f as $x | map(. + $x);

получаем на выходе

["DEBUG:",[[1,2],[10,20]]]

Это показывает, что функция вызывается один раз. Операция map()создаст массив, в котором каждый элемент входного массива имеет [1,2], добавленное к самому себе, давая в результате [[1,2,1,2],[10,20,1,2]].


Чтобы первая функция работала как вторая, вам нужно вызвать ее, используя

.[0] as $x | map(addvalue($x[]))

Чтобы вторая функция работала как первая,вам нужно было бы назвать это как

[.[] as $x | [$x] | addvalue([$x[0]]) | add ]
0
24.10.2021, 05:57

Теги

Похожие вопросы