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
Но при вводе
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, но не сработалоelse if c 2 аргументоми, не чего не выводит:
__changes_for_the_specified_date 2020-11-11 10else c 3 аргументоми, работает правильно:
__changes_for_the_specified_date "*.log" 2020-11-11 10
почему не срабатывает первые два условия?
Ответы (1 шт):
@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
Не уверен что это самые оптимальные варианты но они работают!