-eq:预期的一元运算符

Mat*_*Esu 4 command-line scripts nvidia-settings 16.04

我有这个脚本,当某些应用程序/进程启动时,它会改变 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

编辑:

#!/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
Run Code Online (Sandbox Code Playgroud)

Cha*_*Rex 8

要解决此特定问题

Byte Commander 的回答中可能会处理您的脚本的其他问题,但对于那些来自 Google 的问题,要解决此特定问题,请始终用双引号将变量括起来。例如[ "$dv" -eq "$on" ]

解释

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

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

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

您的变量可能为空,从而导致此问题。为避免此问题,请用双引号将变量的所有用法括起来。