命令在交互式 shell 中工作但不在脚本中

命令在交互式 shell 中工作但不在脚本中
  • 平台: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

当您想要将 shell 命令的输出分配给变量时,请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/.*"//删除剩余双引号之前的所有内容

相关内容