-eq: ожидается унитарный оператор [дубликат]

На этот вопрос уже есть ответ здесь:

У меня есть этот скрипт, который изменяет вибрацию NVIDIA-SETTINGS, когда запускается определенное приложение/процесс (в моем случае Counter-Strike:Global Offensive game)

Script:

#!/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

EDIT:

#!/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
2
задан 13 May 2017 в 20:04

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".

<час>

О том, как запустить этот сценарий автоматически на входе в систему, можно ли читать , Как я запускаю приложения автоматически на входе в систему? или , Как добавить сценарий для Запущения Приложений из командной строки?

1
ответ дан 2 December 2019 в 01:55

Для решения этой определенной проблемы

существуют другие проблемы со сценарием, по-видимому, имел дело с в ответе Командующего Байта, но для тех, которые входят от Google, чтобы решить эту определенную проблему, всегда окружать переменные двойными кавычками. Например [ "$dv" -eq "$on" ].

Объяснение

унарный оператор А только имеет один аргумент. Бинарный оператор имеет два аргумента.

, Например, -eq бинарный оператор, потому что он имеет два аргумента и выясняет, равны ли они.

, Когда оболочка видит [ 3 -eq 3 ], все прекрасно, потому что -eq берет два аргумента, и ей дали два аргумента, 3 с. Что, если один из тех был пробелом, хотя? Это было бы или [ -eq 3 ] или [ 3 -eq ]. Они пропускают один из аргументов, таким образом, оболочка добирается до размышления, что Вы означали использовать оператор, который только имеет один аргумент, унарный оператор.

Ваши переменные могут быть пробелом, вызвав просто эту проблему. Для предотвращения проблемы окружите все использование переменной с двойными кавычками.

4
ответ дан 2 December 2019 в 01:55

Другие вопросы по тегам:

Похожие вопросы: