Подсчёт длины аргумента скрипта
Пишу скрипт, который будет просто принимать аргументы в неограниченном количестве и возвращать самый длинный из них. Сейчас, как видите он просто выдаёт все аргументы. Подскажите, как именно прописать if чтобы проверял и выбирал самый длинный аргумент? И как сделать, чтобы аргументы принимались с дефисом?
#!/bin/zsh
for item in "$@";
do
echo "Параметры $item"
done
Ответы (3 шт):
#!/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, их еще называют флагами).
Попробуем решить задачу используя 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
Это выведет наиболее длинный переданный параметр в скрипт, остается вопрос, что делать со строками такой же длинны, если они присутствуют в других параметрах
Для сортировки можно использовать массив:
#!/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