まず、次のコマンドを実行しています。
実行されたコマンド:
/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status
コマンドの出力は次のとおりです。
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
grep 'follower' | wc -l
「follower」という単語を使用してgrepし、その単語の総数()を印刷したいと思います。
ここで直面する問題は、コマンドの出力を「コマンドが見つかりません」が発生する変数に入れることができないことです。
-bash-4.2$ cat zookeeper.sh
#!/bin/bash
ZK_STATUS = ` /app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status `
ABC = $ZK_STATUS | grep 'follower' | wc -l
echo $ABC
出力:
-bash-4.2$ ./zookeeper.sh
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
./zookeeper.sh: line 2: ZK_STATUS: command not found
./zookeeper.sh: line 4: ABC: command not found
0
ベストアンサー1
=
エラーは、割り当ての前後にスペースがあるために発生します。これはシェルスクリプトのバグです。を使用し
var=value
、使用しないでくださいvar = value
。それ以外の場合、シェルはvar
- というプログラムを実行しようとし、command not found
エラーメッセージが表示されます。使用する必要がありますコマンドの置き換えコマンドの出力を変数として取得します。例えば
ZK_STATUS=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status)
grep
-c
一致する行数を数えるオプションがあるので、wc -l
そうする必要はありません。ZK_STATUS=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status) ABC=$(printf '%s' "$ZK_STATUS" | grep -c follower)
またはもっと直接的に、
ABC=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status | grep -c follower)
単語が複数回表示される行数を計算する代わりに、個々の項目を計算するには
follower
使用できませんgrep -c
。代わりに、次のようにしてください。
ABC=$(printf '%s' "$ZK_STATUS" | grep -o follower | wc -l)
grep -o
各一致は、独自の行に印刷されます。wc -l
次に、この行を計算します。