fish shell -eq и -a в операторе if

Я читал скрипт завершения git.fish (/usr/local/Cellar/fish/2.1.2/share/fish/completions) для оболочки fish и столкнулся с некоторыми проблемами с пониманием того, что означает синтаксис.

В блоке,

function __fish_git_needs_command
  set cmd (commandline -opc)
  if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ]
    return 0
  end
  return 1
end

Я понимаю, что cmd устанавливается как commandline -opc. Но что означают -eq и -a в следующем утверждении (count $cmd) -eq 1 -a $cmd[1] = 'git'?

Я новичок в fish shell, и я пытаюсь понять синтаксис, пытаясь написать свой собственный сценарий завершения для программы. Помощь будет принята с благодарностью.

Спасибо.


person Hasit Mistry    schedule 26.05.2015    source источник


Ответы (3)


На самом деле -eq и -a не являются частью синтаксиса fish. Это обычные аргументы!

if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ]

Открывающая квадратная скобка здесь на самом деле является командой, такой как cat или grep. У вас действительно есть файл /bin/[. Это может быть проще понять с помощью команды test, что то же самое:

if test (count $cmd) -eq 1 -a $cmd[1] = 'git'

Теперь легко увидеть, что -eq и -a — это обычные аргументы, передаваемые в test, не имеющие синтаксического значения для рыбной ловли.

test имеет свой маленький язык, такой как awk или sed. См. man test, чтобы узнать об этом.

person ridiculous_fish    schedule 26.05.2015
comment
Единственное отличие состоит в том, что test встроен в оболочку, поэтому вам не нужно выполнять внешнюю команду. - person glenn jackman; 26.05.2015
comment
Спасибо, что так хорошо ответили. TIL /bin/[ — это исполняемый файл в системе. - person Hasit Mistry; 26.05.2015
comment
Оба теста и [ встроены в большинство оболочек, включая fish. Разницы в производительности нет. - person ridiculous_fish; 27.05.2015

-eq – это целочисленная функция сравнения.

-a — это логичный и.

Таким образом, логический эквивалент будет выглядеть примерно так:

if [ (count $cmd) == 1 && $cmd[1] == 'git' ]

(в псевдосинтаксисе Java).

Фон

Причина, по которой используется -eq, заключается в том, что оболочка обычно работает только с обработкой текста. В результате числа хранятся в «строках». Иногда два числа эквивалентны, но не эквивалентны строке. Например, следующий пример:

if [ "01" -eq "1" ]
then
    echo "integer equal"
fi
if [ "01" = "1" ]
then
    echo "string equal"
fi

Будет напечатано только integer equal.

person Willem Van Onsem    schedule 26.05.2015

Из документации по Fish:

  • NUM1 -eq NUM2 возвращает true, если NUM1 и NUM2 численно равны.
  • COND1 -a COND2 возвращает истину, если и УСЛОВИЕ1, и УСЛОВИЕ2 истинны.

Он проверяет, что (count $cmd) = 1 и что $cmd[1] = 'git'.
(здесь = означает равенство, а не присваивание).

person Marth    schedule 26.05.2015
comment
Спасибо. Я искал именно эту ссылку. Я искал все вокруг, используя разные условия поиска, но просто не мог найти его. - person Hasit Mistry; 26.05.2015