
Здравствуйте, я пытаюсь создать скрипт, который читает мой файл, берет все необходимые ему переменные, а затем использует их для другой команды. Но, похоже, переменные не запоминаются, потому что я попробовал printf вместо запуска моего скрипта и получил пустой вывод.
вот мой код
#!/bin/bash
numparams=$#
params=$*
cat tots.txt | while read;
do awk '{
regid=$1;
uport=$2;
ongoingcalls=$3;
ingeg=$4;
maxcalls=$5;
if($3<$5) state=0
if($3==$5) state=1
if($3>$5) state=2
}'
/home/send_script.sh -o "$regid $uport $ongoingcalls $ingeg $maxcalls $state"
done
А вот содержимое tots.txt:
решение1
Это потому, что ваши переменные устанавливаются в подоболочке, которую вы открываете, говоря cat <file> | while ...
. Поэтому, когда эта подоболочка завершится, вы больше не сможете получить доступ к этим переменным.
Вместо этого скажите:
while read; do
...
done < tots.txt
Интересное чтиво:Я задаю переменные в цикле, который находится в конвейере. Почему они исчезают после завершения цикла? Или почему я не могу передать данные на чтение?.
Обратите внимание, что у вас, похоже, есть некоторая путаница между awk
и shell
переменными. Что бы вы ни установили, awk
оно там и останется, так что утверждение awk '{$var=2}'
неверно вдвойне: переменные в awk устанавливаются без $
( $var
будет ссылаться на номер столбца var
), а затем var просто находится в области видимости awk
и недоступно в вашей оболочке.
Возможно, вы захотите сделать что-то вроде:
results=($(awk 'BEGIN {print 1,2,3,"a"}'))
Таким образом, вы создаете массив results[]
, к которому впоследствии сможете получить доступ.