Здесь есть ряд ошибок. Позвольте мне пройти их по порядку:
RECORD = $1
Пробелы не допускаются вокруг =
в назначениях оболочки, поэтому это (и ряд последующих назначений) не сработает. Что это на самом деле делает, так это пытается запустить команду с именем RECORD
с "=" и значением $1
качестве аргументов. В раковинах пространства очень значительны; в большинстве мест они либо полностью необходимы, либо полностью запрещены. Пока вы не узнаете, где они необязательны, будьте очень осторожны, копируя пробелы точно из любых примеров, из которых вы работаете.
echo "$RECORD"|read var1 var 2 var3
Элементы конвейера (например, команда read
здесь) выполняются в подоболочках, что означает, что присвоенные им переменные происходят в подоболочке ... и теряются при выходе из подоболочки. Кроме того, вы не можете иметь пробел в середине имени переменной (var 2
).
Вы можете сделать это без трубы, как это:
read var1 var2 var3 <<<"$RECORD"
(Хотя обратите внимание, что <<<
- это башизм, и он доступен не во всех оболочках. Обязательно начните свой сценарий с #!/bin/bash
НЕ #!/bin/sh
.)
var1=`echo $var1`
var2 =`echo $var2`
var3=`echo $var3`
Даже после удаления блуждающего пространства из второй строки, они не делают ничего полезного. Они принимают значения переменных, выводят их, записывают выходные данные команд echo и вставляют их обратно в переменные. По пути могут произойти некоторые изменения (например, расширение по шаблону), но я почти уверен, что это не то, чего вы хотите, чтобы происходило. (На самом деле, вы почти всегда должны помещать ссылки на переменные в двойные кавычки, чтобы предотвратить такие вещи, как неожиданное расширение подстановочных знаков и разбиение слов.) Так что просто потеряй это.
export var1 var2 var3
export
указывает оболочке экспортировать значение этих переменных в команды, которые вы запускаете из этой оболочки - то есть они экспортируются по иерархии процессов, а не до того, что выполнялось. Но в этом случае функция выполняется в том же процессе, что и основная часть скрипта, поэтому нет необходимости в импорте для совместного использования переменных в обоих направлениях. Пока переменные не объявлены как local
, они автоматически доступны для остальной части скрипта. Так что потерять это тоже.
(Обратите внимание, что нет способа экспортировать переменные вверх по иерархии процесса. То, что происходит в подоболочке или другом подпроцессе, остается в этом подпроцессе.)
function "EACH_RECORD"
Вам нужно $
перед EACH_RECORD
, иначе он будет просто передан в виде литеральной строки.
Кстати, я настоятельно рекомендую запускать ваши скрипты через shellcheck.net - он покажет много основных ошибок, прежде чем они доставят вам неприятности.