2010-11-11 3 views
0

Я пишу сценарий оболочки, который анализирует файл журнала. Важная часть заключается в следующем:Shell script double quotes

rx=$(echo "$logfile" | grep -o "rx_value.*" | grep -o "[0-9]\{1,10\}") 
echo rx=$rx 

печатается на STDOUT (НЕПРАВИЛЬНО) следующее:

rx= 

Если я удалить двойные qoutes от $ логфайл так:

rx=$(echo $logfile | grep -o "rx_value.*" | grep -o "[0-9]\{1,10\}") 
echo rx=$rx 

The следующее печатается в STDOUT (ПРАВИЛЬНО):

rx=0 

Я был уверен, что было бы полезно использовать двойные кавычки вокруг переменных, поэтому я использовал их для всех переменных в моем скрипте. Информация, которую я нашел до сих пор, говорит о том, что, если кто-то не ставит двойные кавычки вокруг переменных, результат может стать неправильным из-за разбиения слов, глобирования и т. Д.

Может ли кто-нибудь объяснить, что здесь происходит?

Edit:

$ файл_журнала содержит логфайл загруженный с Wget:

$logfile=(wget -q -O -"http://www.example.com") 
+1

В чем содержится '$ logfile'? –

+0

Это все еще не отвечает на вопрос Игнасио. Каков пример содержимого '$ logfile', а не« откуда он появился »? –

ответ

0

Вы не упоминаете значение $logfile. Ваша информация верна - разница между кавычками и двойными кавычками - это точно разделение поля и глобулизация. Поэтому, если вы полагаетесь на одно из них, вы получите неправильные результаты с двойными кавычками.

ОБНОВЛЕНИЕ. Хорошо, поэтому ваша переменная содержит файл журнала, полученный с помощью wget. Могу ли я предложить использовать трубу вместо этого?

rx=$(wget -q -O -"http://www.example.com" | 
    grep -o "rx_value.*" | 
    grep -o "[0-9]\{1,10\}") 

Но это, вероятно, выход тот же, что ваш двойные кавычки, например, и я доверил бы это больше, чем вы думаете, является правильным ответом.

+0

Я мог бы попробовать провести с этим несколько тестов. – frank099

0

Что произойдет, если вы укажете переменную на выходе?

echo "rx=$rx" 

Не делать этого часто является источником «таинственного» поведения.

+0

Это также печатает неправильный вывод. Фактически эхо-линия предназначена только для отладки, значение используется в другом месте скрипта. – frank099

1

Я думаю, что ваш logfile имеет новую строку между rx_value и номером, который вы ищете. Команда echo с расширением без кавычек преобразует новую строку в пространство. См. Разбиение слов или разбиение полей в документации.