Подсчёт длины аргумента скрипта

Пишу скрипт, который будет просто принимать аргументы в неограниченном количестве и возвращать самый длинный из них. Сейчас, как видите он просто выдаёт все аргументы. Подскажите, как именно прописать if чтобы проверял и выбирал самый длинный аргумент? И как сделать, чтобы аргументы принимались с дефисом?

#!/bin/zsh
for item in "$@";
do
echo "Параметры $item"
done

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

Автор решения: Zt.
#!/bin/zsh

без необходимости лучше не использовать zsh для скриптов

принимать аргументы в неограниченном количестве и возвращать самый длинный из них.

один из способов решения задачи:

#!/bin/bash

for item in "$@"; do
  items=$items"\n"$item
done

max_item=$(echo -e "$items" |awk '$0!=""{print length($0),NR,$0}' |sort -n |awk 'END{print $2-1}')

echo "Самый длинный аргумент: ${!max_item}"

пример работы скрипта:

$ ./script.sh dsfdsf df "12345678 1" sdfsd "123456789 2" 44
Самый длинный аргумент: 123456789 2

Если длинных аргументов несколько то можно вывести их все

#!/bin/bash

for item in "$@"; do
  items=$items"\n"$item
done

ARGS=$(echo -e "$items" |awk '$0!=""{print length($0),NR,$0}' |sort -n)
MAX_LENGTH=$(echo "$ARGS" |awk 'END{print $1}')
echo "$ARGS" |awk -v N=$MAX_LENGTH '$1==N{$1=$2="";print "Самый длинный аргумент "++i":"$0}'

пример работы скрипта:

$ ./script.sh dsfdsf df "12345678ф 1" sdfsd "123456789 2" 44
Самый длинный аргумент 1:  12345678ф 1
Самый длинный аргумент 2:  123456789 2

И как сделать, чтобы аргументы принимались с дефисом?

посмотри https://devhints.io/bash (раздел Getting options), там есть шаблон как принимать параметры с одним(-) или двумя дефисами(--), кроме того там есть возможность задавать аргументы с параметрами (пример --arg1=123 и/или --arg 123) и без (пример --arg1, их еще называют флагами).

→ Ссылка
Автор решения: ipatev_nn

Попробуем решить задачу используя bash

script.sh:

#!/bin/bash

#создаем массив и добавляем в нулевой элемент пустоту
#Дописываем все входящие параметры в массив
#Устанавливаем разделение строк \n, что бы параметры с пробелом не страдали
IFS=$'\n' arr=( "" `printf '%s\n' "$@"` )
#цикл по длине массива
for ((i=0;i<${#arr[@]};i++));do
#Проверяем является ли длинна строки больше максимальной длинны строки
#Если да, то записываем элемент массива в переменную max
    [[ ${#arr[$i]} -gt ${#arr[${max:-0}]} ]] && max=$i
done
echo -e "Параметр: \$$max\nДлина: ${#arr[$max]}\nЗначение: ${arr[$max]}"

console:

script.sh "fwegwg fwfwef" geger ergherhrtmj
#output> Параметр: $1
#output> Длина: 13
#output> Значение: fwegwg fwfwef

Это выведет наиболее длинный переданный параметр в скрипт, остается вопрос, что делать со строками такой же длинны, если они присутствуют в других параметрах

→ Ссылка
Автор решения: Ivan

Для сортировки можно использовать массив:

#!/bin/bash

for arg in "$@"; {
    N=${#arg}    # передать длинну аргумента в переменную N
    sort[N]=$arg # создать ячейку с номером N в массиве sort
}

echo ${sort[@]:(-1)} # вывести последний элемент массива sort

Проверим:

$ ./test 1 22 3 44
44

Если же необходимо сохранить только первый "самый длинный" аргумент, добавим условие:

...
[[ ${sort[N]} ]] || sort[N]=$arg # создать ячейку если её нет
...

Проверим:

$ ./test 1 22 3 44
22
→ Ссылка