2015-02-18 3 views
0

я наткнулся на интересную вещь в Shell Scripting и не 100% уверен, почему поведение как этотShell Script Variable Scope с commnd

Я попытался ниже сценарий:

#!/bin/sh 
CMD="curl -XGET http://../endpoint"; 
var1=eval $CMD | sed -e 's/find/replace/g'; 
echo $var1; # Output: printed the value on this line 
echo $var1; # Output: blank/no data printed (Why it is blank?) 

я должен был изменить команда в переменной, включающей back-tick `, чтобы печатать переменную столько раз, сколько я хотел.

CMD="curl -XGET http://../endpoint"; 
var1=`eval $CMD | sed -e 's/find/replace/g'`; 
echo $var1; # Output: printed the value on this line 
echo $var1; # Output: printed the value on this line 
  • Почему я должен окружить свою команду с `присвоить это о/р переменный в последующем использовании переменного?

У меня такое ощущение, что оно имеет какое-то отношение к области переменных.

Пролить свет на мое понимание будет оценено!

UPDATE: Я попробовал команду ниже, и она работает в моем env.

#!/bin/sh 
CMD="curl -XGET http://www.google.com/"; 
var1=eval $CMD | sed -e 's/find/replace/g'; 
echo $var1; # Output: printed the value on this line 
echo "######"; 
echo $var1; # Output: blank/no data printed (Why it is blank?) 
+0

Обратите внимание, что синтаксис «$ (...)» предпочтительнее по сравнению с синтаксисом обратного хода. Вот объяснение: http://mywiki.wooledge.org/BashFAQ/082 – pmohandas

+0

Спасибо pmohandas за предложение. – rohit12sh

ответ

2

sh/bash позволяет запускать команду с переменной в своей среде без постоянной модификации переменной в оболочке. Это здорово, потому что вы можете, например, выполнить команду на определенном языке, только один раз без изменения всей вашей пользователя или язык системы:

$ LC_ALL=en_US.utf8 ls foo 
ls: cannot access foo: No such file or directory 
$ LC_ALL=nb_NO.utf8 ls foo 
ls: cannot access foo: Ingen slik fil eller filkatalog 

Однако, это означает, что, когда вы пытаетесь сделать

var=this is some command 

вы будете триггером это синтаксис.

Это означает «запустить команду is a command и сказать ему, что переменная var устанавливается в this»

Он не присваивает «это моя строка» переменной, и это, безусловно, не оценивает «это строка "в качестве команды, а затем назначить его вывод var.

Учитывая это, мы можем посмотреть на то, что произошло на самом деле:

CMD="curl -XGET http://../endpoint"; 
var1=eval $CMD | sed -e 's/find/replace/g'; # No assignment, output to screen 
echo $var1; # Output: blank/no data printed 
echo $var1; # Output: blank/no data printed 

Там нет вопроса масштабы и нет несоответствия: переменная никогда не назначается, и никогда не написана эхо заявления.

var=`some command` (или предпочтительно var=$(some command)) работает, потому что это допустимый синтаксис для назначения вывода из программы переменной.

+0

aaha, если это так, позвольте мне запустить тест, чтобы подтвердить мое понимание. Thannks. Я дам вам знать. – rohit12sh

+0

Удивительный! Благодарю. Это выражение «эхо» смутило меня. Когда я удаляю «эхо», я все еще вижу команду o/p. Это имеет смысл сейчас. Спасибо! – rohit12sh

1

Первый пример - это не то, что вы думаете.

Ни эхо ничего не печатает. Сделайте их echo "[$var1]", чтобы увидеть это.

Вам нужны обратные выходы к выполнить команду и выполнить ее вывод.

Ваша первая попытка запуска $CMD | sed -e 's/find/replace/g'; трубопровода с окружающей средой, содержащей $CMDvar1 набор до значения eval.

Вы также не должны размещать команды внутри строк (или используя eval в целом). См. http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации о том, почему.

+0

Не играйте в игры с эхом. Запустите строки, как я сказал, чтобы вы могли видеть, что выдает каждое эхо. Кроме того, поставьте спать между строкой '$ CMD' и первой строкой' echo'. 'Echo' * не * печатает что-либо. –

+0

Спасибо, Etan! Я понял это сейчас. – rohit12sh