【问题标题】:BASH - String output is not what I expectedBASH - 字符串输出不是我所期望的
【发布时间】:2020-07-27 03:46:01
【问题描述】:

我有需要回应的情况:

变量 - 纯文本 - 函数调用的结果

我很困惑呼应时各种符号的含义

这是我的功能:

#!/bin/bash

getLogTimestamp() {
    echo $(date +%Y-%m-%dT%H:%M:%S.130Z)
}

getDisplayName(){
echo $(awk -F'=' '/^CARBON_LITE_PLAYER_ID=.*/ { print $2;}' /home/benja/app/.env)
}

getDeviceIPAddress(){
echo $(hostname -i)
}

getSystemUptime(){
echo $(uptime)
}

getDateTimeInfo(){
echo "$(timedatectl status | awk '/Warning/{exit} 1')"
}

getMemoryInfo() {
    arr=( $(free -h) )
    keys=("${arr[@]::8}")
    vals=("${arr[@]:8:12}")
    for i in ${!keys[@]}; { printf -v data[i] "%s: %s, " "${keys[i]}" "${vals[i]}"; }
    data="${data[@]}"
    echo ${data%,*}
}

getDiskInfo()
{
  arr=($(df -h))
    keys=("${arr[@]::6}")
    vals=("${arr[@]:7:100}")
    for i in ${!keys[@]}; { printf -v data[i] "%s: %s, " "${keys[i]}" "${vals[i]}"; }
    data="${data[@]}"
    echo ${data%,*}
}

getDisplayState(){
    STATE=$(/opt/vc/bin/tvservice -s | awk '/state/  {print $2}')

    case $STATE in

    $STATE=0x40001 )
            echo VC_SDTV_NTSC, VC_HDMI_UNPLUGGED 
            ;;
    $STATE=0x40002 )
            echo VC_SDTV_NTSC, VC_HDMI_ATTACHED
            ;;
    $STATE=0x120002 )
            echo VC_SDTV_ATTACHED, VC_SDTV_CP_INACTIVE, VC_HDMI_ATTACHED
            ;;
    $STATE=0x120005 )
            echo VC_SDTV_ATTACHED, VC_SDTV_CP_INACTIVE, VC_HDMI_UNPLUGGED, VC_HDMI_DVI
            ;;
    $STATE=0x120016 )
            echo VC_SDTV_ATTACHED, VC_SDTV_CP_INACTIVE, VC_HDMI_ATTACHED, VC_HDMI_DVI, VC_HDMI_HDCP_UNAUTH
            ;;
    $STATE=0x12001a )
            echo VC_SDTV_ATTACHED, VC_SDTV_CP_INACTIVE, VC_HDMI_ATTACHED, VC_HDMI_HDMI, VC_HDMI_HDCP_UNAUTH
            ;;
    $STATE=0x12001a )
            echo VC_SDTV_ATTACHED, VC_SDTV_CP_INACTIVE, VC_HDMI_ATTACHED, VC_HDMI_HDMI
            ;;
    $STATE=0x120009 )
            echo  VC_SDTV_ATTACHED, VC_SDTV_CP_INACTIVE, VC_HDMI_UNPLUGGED, VC_HDMI_HDMI
            ;;
    esac
}

在一个单独的文件中,我调用了这些函数:

#Logging
. /home/benja/app/scripts/log-helper-functions.sh
LOGTIMESTAMP=getLogTimestamp

# RSH -We are logging this data every time this script runs (chron job)

echo $LOGTIMESTAMP "Display Name: $(getDisplayName)"

echo $LOGTIMESTAMP "Device IP: $(getDeviceIPAddress)"

echo $LOGTIMESTAMP "System UpTime: $(getSystemUptime)"

echo $LOGTIMESTAMP "DateTime Info: $(getDateTimeInfo)"

echo $LOGTIMESTAMP "Memory Info: $(getMemoryInfo)"

echo $LOGTIMESTAMP "Disk Info: $(getDiskInfo)"

echo $LOGTIMESTAMP "Display State: $(getDisplayState)"

# RSH end

这是一个输出示例:

getLogTimestamp Display Name: UAT-101429
getLogTimestamp Device IP: 10.0.0.120
getLogTimestamp System UpTime: 23:26:06 up 19:54, 1 user, load average: 1.66, 0.82, 0.47
getLogTimestamp DateTime Info:       Local time: Thu 2020-04-09 23:26:06 EDT
  Universal time: Fri 2020-04-10 03:26:06 UTC
        RTC time: n/a
       Time zone: America/New_York (EDT, -0400)
 Network time on: yes
NTP synchronized: no
 RTC in local TZ: yes
getLogTimestamp Memory Info: total: 174M, used: 42M, free: 91M, shared: 388M, buff/cache: 317M, available: Swap:, Mem:: 0B, 605M: 0B
getLogTimestamp Disk Info: Filesystem: /dev/root, Size: 30G, Used: 4.6G, Avail: 23G, Use%: 17%, Mounted: /
getLogTimestamp Display State: 

问题:显然 $TIMESTAMP 没有解析,Display State 也没有解析。

我做错了什么?

TIA -罗恩

【问题讨论】:

  • bash 中的变量赋值不允许左侧的 $,afaik 唯一可行的方法是使用臭名昭著的 eval ,或者我只是在想象事情:-)
  • @Jetchisel :我没有看到任何 $VAR=value 错误。如果您想到$STATE=0x40001 的东西,这些应该是与case 匹配的通配符模式,而不是分配。不过,case 看起来并不正确,但原因不同。
  • @user1934428,为什么不回答这个问题呢?
  • 因为已经有了,by choroba。
  • @RSH 试试shellcheck.net

标签: bash output


【解决方案1】:

作业的右侧通常不会运行。您需要告诉 bash 运行它并使用输出:

LOGTIMESTAMP=$(getLogTimestamp)

case 语句具有不同的语法。每个案例只包含值,您已经在case $STATE 行中声明了$STATE,无需在每一行重复。

case "$STATE" of
    0x40001) ...

【讨论】:

  • 啊,明白了!现在 $LOGTIMESTAMP 显示正确,但 DisplayState 仍然为空:2020-04-10T00:04:35.130Z - Display State:
  • getDisplayState(){ STATE=$(/opt/vc/bin/tvservice -s | awk '/state/ {print $2}') case $STATE in 0x40001) echo VC_SDTV_NTSC, VC_HDMI_UNPLUGGED ;; ...
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多