2015-05-26 2 views
0

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

В блоке

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. Но в следующем заявлении (count $cmd) -eq 1 -a $cmd[1] = 'git', что делать -eq и -a означает?

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

спасибо.

ответ

5

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

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

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

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

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

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

+0

Единственное отличие состоит в том, что 'test' встроен в оболочку, поэтому вы сохраняете выполнение внешней команды. –

+0

Спасибо, что ответили так хорошо. TIL '/ bin/[' является исполняемым в системе. –

+0

Оба теста и [встроены в большинство снарядов, включая рыбу. Нет разницы в производительности. –

1

-eq является integer comparison function.

-a является logical and.

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

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.

1

От Fish documentation:

  • NUM1 -eq NUM2 возвращает истину, если NUM1 и NUM2 численно равны.
  • COND1 -a COND2 возвращает true, если оба COND1 и COND2 являются истинными.

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

+1

спасибо. Я искал эту точную ссылку. Я искал все вокруг, используя разные поисковые запросы, но просто не мог найти его. –