fish shell (условные конструкции if else)

Есть функция __changes_for_the_specified_date которая должна выводить информацию в зависимости от параметров.

function __changes_for_the_specified_date --description '1 аргумент -тип файла ("*.log"), 2 аргумент - дата (2020-11-13), 3 аргумент - выводимое количество (10)'  
   
   if [(count $argv) -eq 1];
      find . -type f -newerat $argv[1]

   else if [(count $argv) -eq 2];
      find . -type f -newerat $argv[1] | tail -n$argv[2]
   
   else if [ (count $argv) -eq 3];
      find ./ -name $argv[1] -type f -newerat $argv[2] | tail -n$argv[3]

end 

Но при вводе

  1. if c 1 аргументом выдаёт ошибку:

    __changes_for_the_specified_date 2020-11-11
    ~/.config/fish/functions/__changes_for_the_specified_date.fish (line 1): Missing end to balance this function definition
    function __changes_for_the_specified_date --description '1 аргумент -тип файла ("*.log"), 2 аргумент - дата (2020-11-13), 3 аргумент - выводимое количество (10)'
    ^
    from sourcing file ~/.config/fish/functions/__changes_for_the_specified_date.fish
    in command substitution
    source: Error while reading file “/home/xxx/.config/fish/functions/__changes_for_the_specified_date.fish”
    find: The ‘-newerat’ test needs an argument
    

    но если просто ввести в консоль find . -type f -newerat 2020-11-11, то всё работает верно
    пробовал для условия if заменить $argv[1] на $argv, но не сработало

  2. else if c 2 аргументоми, не чего не выводит: __changes_for_the_specified_date 2020-11-11 10

  3. else c 3 аргументоми, работает правильно: __changes_for_the_specified_date "*.log" 2020-11-11 10

почему не срабатывает первые два условия?


Ответы (1 шт):

Автор решения: EugeneTM

@Fat-Zer бал прав про end, end важен! Но главная проблема была в порядке выполнения. Вот рабочий вариант.

function __changes_for_the_specified_date

if [(count $argv) -eq 3 ];
   find ./ -name $argv[1] -type f -newerat $argv[2] | tail -n$argv[3]    
else if [(count $argv) -eq 2 ];
   find . -type f -newerat $argv[1] | tail -n$argv[2]   
else
   find . -type f -newerat $argv[1]

end
end

Так же я нашёл другое решение:

function __changes_for_the_specified_date 

if set -q argv[3]
   find . -name $argv[3] -type f -newerat $argv[1] | tail -n$argv[2] | sort -r    
else if set -q argv[2]
   find . -type f -newerat $argv[1] | tail -n$argv[2] | sort -r    
else if  set -q argv[1]    
    find . -type f -newerat $argv[1] | sort -r    
else
   echo "Вы не ввели аргументы. Введите дату (yyyy-mm-dd) или дату (yyyy-mm-dd) и количество выводимых строк (10), или дату (yyyy-mm-dd) количество строк (10) и расширение ("*.log")."
  
end
end

Не уверен что это самые оптимальные варианты но они работают!

→ Ссылка