-eq:预期一元运算符

-eq:预期一元运算符

我有这个脚本,当启动某些应用程序/进程时,它会改变 NVIDIA-SETTINGS 的活力(在我的情况下是《反恐精英:全球攻势》游戏)

脚本:

#!/bin/bash

on="1023"
off="0"
dv="0"


# RESET
sleep 10
log "RESET"
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"

while true; do #daemon mode
dv=`nvidia-settings -q "[gpu:0]/DigitalVibrance[DFP-0]" -t`
  if pgrep -l csgo | grep csgo_linux
  then
#  log "Process csgo_linux found"
    if [ $dv -eq $off ]; then
      nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$on"
    fi
  else
# No process found
    if [ $dv -eq $on ]; then
      nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"
    fi
  fi

  if [ $dv -eq $on ]; then
  sleep 5
  else
  sleep 1
  fi

done

这个脚本有什么问题,为什么它会给出这些错误?

622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected

编辑:

#!/bin/bash

on="1023"
off="0"
dv="0"


# RESET
sleep 10
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"

while true; do #daemon mode
dv=`nvidia-settings -q "[gpu:0]/DigitalVibrance[DFP-0]" -t`
  if pgrep -l csgo | grep csgo_linux
  then
#  log "Process csgo_linux found"
    if [ "$dv -eq $off" ]; then
      nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$on"
    fi
  else
# No process found
    if [ "$dv" -eq "$on" ]; then
      nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"
    fi
  fi

  if [ "$dv -eq $on" ]; then
  sleep 5
  else
  sleep 1
  fi

done

答案1

解决此特定问题

您的脚本中还存在其他问题,Byte Commander 的答案可能已经处理过这些问题,但对于来自 Google 的用户来说,要修复这个特定问题,请始终用双引号将变量括起来。例如[ "$dv" -eq "$on" ]

解释

一元运算符只有一个参数。二元运算符有两个参数。

例如,-eq是一个二元运算符,因为它有两个参数,并且判断它们是否相等。

当 shell 看到 时[ 3 -eq 3 ],一切都很好,因为-eq需要两个参数,并且它被赋予了两个参数,即3s。但是,如果其中一个为空怎么办?它要么是 ,要么是[ -eq 3 ][ 3 -eq ]它们缺少一个参数,因此 shell 会认为您打算使用只有一个参数的运算符,即一元运算符。

您的变量可能为空,这会导致此问题。为避免此问题,请用双引号括住所有变量。

答案2

我为你重写了剧本,在聊天中讨论

#!/bin/bash

# set log_enabled="true" for status output, else log_enabled="false"
log_enabled="true"

on="1023"
off="0"
dv="0"


log () {
  if $log_enabled
    then 
      echo "$(date +%H:%M:%S) - $1"
  fi
}


log "waiting 10 seconds..."
sleep 10

log "resetting DigitalVibrance to $off (off)"
nvidia-settings -a "DigitalVibrance=$off" > /dev/null

log "beginning to watch for csgo_linux processes"
while true
do
  dv=$(nvidia-settings -q "DigitalVibrance" -t)
  log "current DigitalVibrance setting: $dv"

  if pgrep "csgo_linux" > /dev/null
    then  # if CS:GO is running
      if [ "$dv" -eq "$off" ]
        then  # if DigitalVibrance is currently off
          log "setting DigitalVibrance to $on (on)"
          nvidia-settings -a "DigitalVibrance=$on" > /dev/null
      fi

    else  # if CS:GO is not running
      if [ "$dv" -eq "$on" ]
        then  # if DigitalVibrance is currently on
          log "setting DigitalVibrance to $off (off)"
          nvidia-settings -a "DigitalVibrance=$off" > /dev/null
      fi
  fi

  if [ "$dv" -eq "$on" ]
    then
      sleep 5
    else
      sleep 1
  fi

done

这应该可以正常工作,除非命令nvidia-settings -q "DigitalVibrance" -t具有空输出而不是返回当前设置值作为数字的情况。

它的格式更美观,修复了原始脚本中的一些错误,正确引用了测试中的变量,if并使用实际有效的命令来获取和设置 nvidia 设置值,因为我们发现原始脚本中的命令对您的系统没有任何作用。我还添加了一个可选的日志记录功能,以在控制台中显示一些状态输出,您可以通过用 替换行log_enabled="true"来禁用它log_enabled="false"


关于如何在登录时自动启动此脚本,您可以阅读如何在登录时自动启动应用程序?或者如何从命令行将脚本添加到启动应用程序?

相关内容