12

バックティックを使用してシェルスクリプトを機能させるのに問題があります。これが私が問題を抱えているスクリプトのサンプルバージョンです:

#!/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;

このスクリプトの出力は次のとおりです。

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

コマンドに変数を使用する最初のバックティックが実際には完全なコマンドを実行せず、2番目のコマンドと一緒に最初のコマンドの出力のみを返すのはなぜですか?コマンドを実行するための最初のバックティックを取得するために何かが足りませんか?

4

4 に答える 4

16

あなたはevalそれを機能させるために使用する必要があります

result=`eval ${ECHO_CMD}`;

代わりに

result=`${ECHO_CMD}`;

それなしeval

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

これはに拡張されます

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

の引数として扱われ、echo逐語的に出力されます。そのeval行で実際に実行されます。

于 2010-10-13T19:14:18.380 に答える
2

こんにちは、

evalコマンドを知っている必要があります。

見る :

#!/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"

ドキュメントを見てください:

help eval
于 2010-10-13T19:17:10.607 に答える
0

最初の例では、echoはパラメーターを解析しています-シェルはパラメーターを認識しません。2番目の例では、シェルが解析を実行していて、パイプをどう処理するかを知っているため、これは機能します。ECHO_CMDを「bashecho...」に変更すると、機能します。

于 2010-10-13T19:06:37.583 に答える
0

Bashはあなたのためにあなたの命令を逃れています。試す

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;

またはさらに良いことに、最初の行で-xを設定してみてください。そうすれば、bashが何をしているのかがわかります。

于 2010-10-13T19:14:33.763 に答える