Я бы не советовал анализировать вывод ls
, find
и т. д. (см. ParsingLs — Wiki Грега для объяснения, почему это плохая идея).
Вместо этого расширение параметров в массиве bash может создать список без расширений файлов.
filelist=(*); # or filelist=(*.log.*) to be more precise
printf '%q\n' "${filelist[@]%.*}" # or echo "${filelist[@]%.*}"
Затем, чтобы работать с файлами по отдельности..
for i in "${filelist[@]%.*}"; do
echo "$i";
done
Для конкретной цели OP мы можем использовать bash ассоциативный массив для хранения количества версий.
filelist=(*.log.*)
declare -A count
for i in "${filelist[@]%.*}"; do
(( count["$i"]++ ));
done
for j in "${!count[@]}"; do
printf '%q\t%q\n' "$j" "${count[$j]}";
done | sort
report01.log 6
report02.log 6
report03.log 6
report04.log 6
report05.log 6
Как заметил ivanivan, интерпретация параметров строки в вашем случае осуществляется программой (useradd
). Многим программам не важен порядок параметров, но некоторым он важен.
Напр. convert
(из пакета imagemagick) преобразует изображения и указывает:
convert [input-option] input-file [output-option] output-file
Таким образом, параметры ввода должны быть указаны перед входным файлом, и аналогично для параметров вывода.
Существуют гораздо более сложные примеры, такие как компиляторы, которым для корректной работы необходимо, чтобы параметры располагались в определенном порядке.
Во всех случаях рекомендуется обращаться к справочным страницам
команды или --help (или -h, или -?, или чему-то еще) программы, которую вы хотите запустить.Что-то может пойти не так...