Захват и тестирование выходной команды в ZSH

Я пробовал бесчисленные способы получить то, что я хочу, но ничего не получается. Я всегда заканчиваю с чем-то вроде 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 ответа

Решение

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

if [ $testv = '!' ]; then

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

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

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

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

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

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

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

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

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

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

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