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

У этого вопроса уже есть ответ: ожидаемый ответ унарного оператора 2 ответа

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

Сценарий:

#!/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: [ ! d9] #!/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

6 ответов

Я переписал вам сценарий, как обсуждалось в чате:

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

О том, как начать этот скрипт автоматически при входе в систему, вы можете прочитать в чате или Как добавить скрипт к Startup Applications из командной строки?

1
ответ дан 22 May 2018 в 22:39

Я переписал вам сценарий, как обсуждалось в чате:

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

О том, как начать этот скрипт автоматически при входе в систему, вы можете прочитать в чате или Как добавить скрипт к Startup Applications из командной строки?

1
ответ дан 18 July 2018 в 13:21

Я переписал вам сценарий, как обсуждалось в чате:

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

О том, как начать этот скрипт автоматически при входе в систему, вы можете прочитать в чате или Как добавить скрипт к Startup Applications из командной строки?

1
ответ дан 24 July 2018 в 20:09

Чтобы исправить эту конкретную проблему

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

Объяснение

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

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

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

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

2
ответ дан 22 May 2018 в 22:39

Чтобы исправить эту конкретную проблему

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

Объяснение

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

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

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

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

2
ответ дан 18 July 2018 в 13:21

Чтобы исправить эту конкретную проблему

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

Объяснение

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

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

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

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

2
ответ дан 24 July 2018 в 20:09

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

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