2010-10-13 7 views
7

Mam problem z tym, że mój skoroszyt działa z użyciem odsunięć. Oto przykład wersja skryptu Mam problem z:Problem z odsunięciami w powłoce shellscript

#!/bin/sh 

ECHO_TEXT="Echo this" 
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'" 

result=`${ECHO_CMD}`; 
echo $result; 

result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`; 
echo $result; 

Wyjście z tego skryptu jest:

sh-3.2$ ./test.sh 
Echo this | awk -F' ' '{print $1}' 
Echo 

Dlaczego najpierw lewy apostrof przy użyciu zmiennej dla polecenia nie faktycznie wykonać pełne polecenie, ale zwraca tylko wynik pierwszego polecenia wraz z drugim poleceniem? Brakuje mi czegoś, aby uzyskać pierwszy backtick do wykonania polecenia?

+3

backticks są strasznie przestarzałe i nie powinien być stosowany dłużej - używając '$()' zamiast pozwoli Ci zaoszczędzić wiele bóle głowy – Daenyth

+4

Patrz [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050) (nie wpisuj poleceń w zmiennych) i [BashFAQ/048] (http://mywiki.wooledge.org/ BashFAQ/048) (unikaj używania 'eval'). Twój Shebang mówi "#!/Bin/sh", a twój monit mówi "sh", ale twój tag pytający mówi "[bash]", co nie jest tym samym. –

+0

Nie ustawiłem tagu bash, inny użytkownik zmienił to po tym, jak to opublikowałem. – benw

Odpowiedz

10

Trzeba użyć eval aby dostać pracy

result=`eval ${ECHO_CMD}`; 

w miejsce

result=`${ECHO_CMD}`; 

Bez eval

${ECHO_TEXT} | awk -F' ' '{print \$1} 

który zostanie poszerzona do

Echo this | awk -F' ' '{print \$1} 

będzie traktowany jako argument do echo i będzie wyprowadzany dosłownie. Z eval linia ta będzie w rzeczywistości uruchomiona.

0

W twoim pierwszym przykładzie echo analizuje parametry - powłoka nigdy ich nie widzi. W drugim przykładzie działa, ponieważ powłoka wykonuje parsowanie i wie, co zrobić z potokiem. Jeśli zmienisz ECHO_CMD na "bash echo ..." to zadziała.

0

Bash ucieka przed tobą za ciebie. Staraj

ECHO_TEXT="Echo this" 
ECHO_CMD='echo ${ECHO_TEXT} | awk -F" " "'"{print \$1}"'"' 

result=`${ECHO_CMD}`; 
echo $result; 

result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`; 
echo $result; 

Albo jeszcze lepiej, spróbuj ustawić -x na pierwszej linii, więc można zobaczyć, co robi bash

2

You Hi

trzeba wiedzieć EVAL polecenie.

zobacz:

#!/bin/sh 

ECHO_TEXT="Echo this" 
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'" 

result="`eval ${ECHO_CMD}`" 
echo "$result" 

result="`echo ${ECHO_TEXT} | awk -F' ' '{print $1}'`" 
echo "$result" 

Spójrz na Doc:

help eval 
Powiązane problemy