【问题标题】:Cat command with pipe working in bash but not in script带有管道的 Cat 命令在 bash 中工作但不在脚本中
【发布时间】:2021-04-04 08:25:38
【问题描述】:

相当简单的脚本,但我卡住了。

它连接到一个电池平衡器,将信息输出到一个 json 格式的文件中。然后我有一个管道输出到 jq 以获得我需要的信息。 它在 bash shell 中有效,但在脚本中无效:

这是脚本:

echo "Checking battery voltages"
jkbms -p 3C:A5:19:7B:28:09 -o json > /home/bms/batt.log
echo cat /home/bms/batt.log | jq -r '.highest_cell_voltage'
echo "done"

cat 行在脚本输出中显示了这一点:

Checking battery voltages
parse error: Invalid numeric literal at line 1, column 4
done

在 shell 中它按预期工作:

cat /home/bms/batt.log | jq -r '.highest_cell_voltage'
4.152044773101807

我试过用引号等将整个 cat 命令括起来,但我不知所措。

编辑:

但是,这有效:

echo "Checking battery voltages"
jkbms -p 3C:A5:19:7B:28:09 -o json > /home/bms/batt.log
batt=$(cat /home/bms/batt.log)
echo $batt | jq -r '.highest_cell_voltage'
#echo /usr/bin/cat /home/bms/batt.log
echo "done"

【问题讨论】:

    标签: bash cat script


    【解决方案1】:
    jkbms -p 3C:A5:19:7B:28:09 -o json > /home/bms/batt.log
    echo cat /home/bms/batt.log | jq -r '.highest_cell_voltage'
    

    这里的echo 是错误的。顺便说一句,您可以将上面的内容简化为:

    jkbms -p 3C:A5:19:7B:28:09 -o json|tee /home/bms/batt.log|jq -r '.highest_cell_voltage'
    

    如果我需要在屏幕上打印命令的输出,不使用 echo 怎么办?

    如果您想在/home/bms/batt.log 中保存输出,您可以随时cat /home/bms/batt.log
    如果您希望仅在执行时在屏幕上打印命令的输出,您可以tee /dev/tty 而不是tee /home/bms/batt.log
    如果在执行时您希望在屏幕上以及在日志文件中输出,您可以立即tee /home/bms/batt.log /dev/tty

    【讨论】:

    • 感谢您的简化,但我需要了解如何执行上述操作,因为需要将各种内容记录到变量中以比较值。如果我需要在屏幕上打印命令的输出,不使用 echo 怎么办?
    • 我修改了答案。
    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 2015-11-28
    • 2019-10-12
    • 2019-03-17
    • 1970-01-01
    • 2022-01-02
    • 2013-09-28
    • 2016-03-10
    相关资源
    最近更新 更多