2013-03-06 2 views
3

У меня есть команда, я использую, чтобы Получить hostname.localdomainBash переменная из команды с трубами, котировки и т.д.

dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }' 

Это хорошо возвращает результат, как:

michael.lawler. localdomain.com

Я бы хотел использовать этот результат как переменную в сценарии bash.

Кажется, у меня проблемы с прохождением первой трубы.

Если я VAR="dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'"

... я получить обратно всю передачу зоны. Я также пробовал много мелких изменений, добавляя $ перед командой без кавычек, ничего не работает. Любое направление очень ценится.

+1

Если ваша цель - сохранить команду для ее запуска более одного раза, см. Http://mywiki.wooledge.org/BashFAQ/050 («Я пытаюсь добавить команду в переменную, но сложные случаи всегда терпят неудачу! »). Если ваша цель состоит только в том, чтобы сохранить результат, 'var = $ (команда)' –

+0

FYI - вы можете, возможно, попросить 'dig' дать вам меньше информации, чтобы облегчить анализ вывода. См., Например, опцию '+ short'. –

+0

@CharlesDuffy 'awk '{getline; $ 1 = зиЬзЬг ($ 1,1, длина ($ 1) -1); распечатать $ 1; exit} ''делает то, что мне нужно,' + short' на самом деле не работает для моей ситуации, не знаю, почему ... возможно, из-за OSX. Спасибо за предложение. – TryTryAgain

ответ

6
VAR=$(dig axfr @dc1.localdomain.com localdomain.com | 
    grep -i Lawler | 
    awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }') 
+4

Использование '$()' обычно предпочтительнее, чем обратные ссылки, поскольку обратные ссылки не вложены. backticks немного более портативны, но нотация '$()' была стандартной в течение приблизительно 20 лет, и большинство оболочек принимают ее. –

2

Используйте backtics вместо цитаты:

VAR=`dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'` 

Backtics на самом деле означает «пробег все, что здесь и возвращающий стандарт, как значение выражения», но котировки не делать этого.

+1

Оба работают хорошо. Я думаю, что этот способ проще всего запомнить и хорошо работает на многих системах. Как заметил Пурселл, он не будет гнездиться, но я не думаю, что это проблема в этом случае. Вы можете вложить $() внутри backtics, так что это не похоже на тупик. Тем не менее, я не думаю, что действительно есть явный победитель. – bchurchill

Смежные вопросы