Сценарий оболочки двойные кавычки - PullRequest
0 голосов
/ 12 ноября 2010

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

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

В STDOUT (WRONG) выводится следующее:

rx=

Если я удаляю двойные qoutes из $ logfile, как это:

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

Следующее выводится в STDOUT (ПРАВИЛЬНО):

rx=0

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

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

Редактировать:

$ logfile содержит файл журнала, загруженный с помощью wget:

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

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

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

0 голосов
/ 12 ноября 2010

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

echo "rx=$rx"

Невыполнение этого требования часто является источником "таинственного" поведения.

0 голосов
/ 12 ноября 2010

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

UPDATE . Итак, ваша переменная содержит файл журнала, полученный с wget. Могу ли я предложить вместо этого трубу?

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

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

...