コマンドは対話型シェルでは機能しますが、スクリプトでは機能しません。

コマンドは対話型シェルでは機能しますが、スクリプトでは機能しません。
  • プラットフォーム:RHEL7
  • シェル:バッシュ
  • 予想される結果:値を変数として保存

次のテキストからIPをキャプチャしようとしています。

              {
                "ip": "12.34.56.7",
                "type": "LEARNED"
              }

端末で次のコマンドを実行すると、期待どおり IP を取得します。

grep '"ip":' ../path/to/file.txt | awk '{ print $2 }' | tr -d '"' | tr -d ','

スクリプトの内容は次のとおりです。

IP=grep '"ip":' ../path/to/file.txt | awk '{ print $2 }' | tr -d '"' | tr -d ','

IP=私はすべてを引用符で囲むか、サイコロを使用しますが、使用せずにgrep ipテキストの周りの引用符をエスケープするなど、いくつかの他の操作を試しました。\\この問題にアクセスする正しい方法はわかりません。スクリプトに引用符がない場合、スクリプトは私のコマンドを分解するか、何らかの理由でawkから$ 2を削除します。

情報を提供していただきありがとうございます。

ベストアンサー1

シェルコマンドの出力を変数に代入するには、VAR=$(command)次のように使用します。

IP=$(grep '"ip":' ../path/to/file.txt | awk '{ print $2 }' | tr -d '"' | tr -d ',')

しかし、しばらく前に、誰かが複雑sedすぎるのを避けるためにパイプラインを発明することにしました。

IP=$(sed '/"ip":/!d;s/",//;s/.*"//' ../path/to/file.txt)
  • /"ip":/!d"ip":ない行はすべて無視
  • s/",//後続の二重引用符とカンマを削除します。
  • ;s/.*"//残りの二重引用符の前のすべての項目を削除します。

おすすめ記事