2017-08-24 5 views
0

私は以下のコードのためのコマンドが見つからないエラーを取得しています:問題| bashの

#!/bin/sh 
#set -x 
for i in `cat output`; 
do 
eval "MASTER_$i = $(/usr/efm-2.0/bin/efm cluster-status $i 2>/dev/null |grep "Master" |head -1 |awk -F " " {'print$2'})"; 
echo -e "$MASTER_$i"; 
done 

デバッグ出力は、次のとおりです。

 
./test.sh 
++ cat output 
+for i in '`cat output`' 
++ /usr/efm-2.0/bin/efm cluster-status abc 
++ grep Master 
++ head -1 
++ awk -F ' ' '{print$2}' 
+eval 'MASTER_abc = 10.x.x.x' 
++ MASTER_abc = 10.x.x.x 
**./test.sh: line 5: MASTER_abc: command not found** 
+echo -e abc 
abc 
+0

をところで:私は 'while'ループを使用することをお勧めします。 – Cyrus

+0

ファイルの行を反復処理しているわけではありません。ファイルの内容がパス名展開の対象となっているため、空白で区切られた単語を繰り返し処理しています。 [Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)を参照してください。 – chepner

答えて

2

あなたは=周りのスペースを持っています。 .. eval "i = 1"を実行しようとすると、i1に設定する代わりに、パラメータ=1でコマンドiを実行しようとします。

1

強くあなたの代わりに、動的変数名のbashの連想配列を使用することをお勧め:

#!/bin/bash 
#set -x 
declare -A master 
while IFS= read -r line; do 
    master["$line"]=$(/usr/efm-2.0/bin/efm cluster-status "$line" 2>/dev/null |awk '/Master/ {print $2; exit}') 
done < output.file 

for line in "${!master[@]}"; do 
    printf "%s\t%s\n" "$line" "${master[$line]}" 
done 
関連する問題