1

приведенный ниже код не работает в bash, где, работая с sh, он пробовал много обходных путей, таких как вставка после чтения канала, но не сработал.Переменные не экспортируются. кто-нибудь может подсказать что нужно сделать

 function() {
 RECORD = $1
 echo "$RECORD"|read var1 var 2 var3
 var1=`echo $var1`
 var2 =`echo $var2`
 var3=`echo $var3`
 export var1 var2 var3
 }
 ....
 while read EACH_RECORD
 do
 function "EACH_RECORD"
 *action on fecthed variables*

1 ответ1

4

Здесь есть ряд ошибок. Позвольте мне пройти их по порядку:

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 - он покажет много основных ошибок, прежде чем они доставят вам неприятности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .