Захват и тестирование выходной команды в 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)
хоть.)