BASH-String输出不是我所期望的

BASH-String输出不是我所期望的,bash,output,Bash,Output,我有一个需要回应的情况: 变量-纯文本-函数调用的结果 我对回音时各种符号的含义感到困惑 以下是我的职能: #!/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) } getDeviceIPAddre

我有一个需要回应的情况:

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

我对回音时各种符号的含义感到困惑

以下是我的职能:

#!/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
在单独的文件中,我调用以下函数:

#!/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: 
LOGTIMESTAMP=$(getLogTimestamp)
问题:显然$TIMESTAMP没有解析,显示状态也没有解析

我做错了什么

短暂性脑缺血发作
-Ron

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

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: 
LOGTIMESTAMP=$(getLogTimestamp)
case
语句具有不同的语法。每个案例仅包含值,您已经在
案例$STATE
行中声明了
$STATE
,无需在每行重复

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

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

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: 
LOGTIMESTAMP=$(getLogTimestamp)
case
语句具有不同的语法。每个案例仅包含值,您已经在
案例$STATE
行中声明了
$STATE
,无需在每行重复

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

bash中的变量赋值不允许左侧的
$
,因为它唯一的工作方式是使用臭名昭著的
eval
,或者我只是在想象:我没有看到任何
$VAR=value
错误。如果您想到
$STATE=0x40001
之类的东西,这些应该是由
大小写匹配的通配符模式,而不是赋值。尽管如此,
案例
看起来并不正确,但原因不同。@user1934428,为什么不提供这个问题的答案呢?因为已经有了一个答案,由choroba提供。@RSH在bash中尝试变量赋值不允许左侧的
$
,因为它唯一的工作方式是使用臭名昭著的
eval
,或者我只是在想象:-)@Jetchisel:我没有看到任何
$VAR=value
错误。如果您想到
$STATE=0x40001
之类的东西,这些应该是由
大小写匹配的通配符模式,而不是赋值。尽管如此,
案例
看起来并不正确,但原因不同。@user1934428,为什么不提供这个问题的答案?因为已经有一个答案了,由choroba提供。@RSH试试啊,明白了!现在$LOGTIMESTAMP显示正确,但DisplayState仍然为空:2020-04-10T00:04:35.130Z-显示状态:getDisplayState(){State=$(/opt/vc/bin/tvservice-s | awk'/State/{print$2}'))0x40001中的$STATE)echo VC_SDTV_NTSC,VC_HDMI_拔出;;…啊,明白了!现在$LOGTIMESTAMP显示正确,但显示状态仍然为空:2020-04-10T00:04:35.130Z-显示状态:getDisplayState(){STATE=$(/opt/VC/bin/tvservice-s | awk'/STATE/{print$2})案例$STATE在0x40001)echo VC_SDTV_NTSC,VC_HDMI_拔出。。。