Захват и тестирование выходной команды в ZSH - PullRequest
4 голосов
/ 19 февраля 2012

Я пробовал бесчисленные способы получить то, что я хочу, но, похоже, ничего не работает. Я всегда получаю что-то вроде 2:not found.

Я хочу перехватить вывод команды, а затем проверить, равно ли оно "!", Например:

function test() {
  local testv=$(command) 2>/dev/null
  if [ $(#testv) == "!" ]; then
    echo "Exclamation mark!"
  else
    echo "No exclamation mark."
  fi
}

Как мне переписать код выше, чтобы избежать ошибки test:2: = not found?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

Это должно работать:

if [ $testv = '!' ]; then

Здесь было несколько проблем:

  • $(...) запускает команду и заменяет ее вывод; Вы хотите заменить значение переменной, поэтому используйте $var или ${var}.
  • Понятия не имею, что там делал #. ${#var} получит длину $ var, но это не то, что вам нужно.
  • Команда test (для которой [ является синонимом) не понимает ==, поэтому используйте = (если вы программист на C, который будет выглядеть неправильно, но это оболочка, а не С).
  • Я не думаю, что это проблема в скрипте, но для интерактивного ввода "!" не делает то, что вы ожидаете. Я использовал '!', чтобы убедиться, что восклицательный знак не может быть интерпретирован как опция истории.

В качестве альтернативы, вы можете использовать [[ ]] вместо [ ], поскольку он понимает == (и в целом имеет более чистый синтаксис):

if [[ $testv == '!' ]]; then

Кстати, я верю из тега, что этот скрипт выполняется в zsh; в противном случае синтаксис будет немного другим (базовые оболочки не имеют [[ ]], и что-либо, кроме zsh, будет выполнять нежелательный анализ значения $ testv, если оно не заключено в двойные кавычки). Если вы не уверены (или хотите, чтобы он был переносимым), вот версия, которая должна работать в любой posix-совместимой оболочке:

if [ "$testv" = '!' ]; then
2 голосов
/ 19 февраля 2012

Попробуйте с этим:

local testv=$(command 2>/dev/null)

, поскольку это вывод команды, которую вы хотите перенаправить.

(Понятия не имею, что вы подразумеваете под $(#testv).)

...