Я не собираюсь писать ваш сценарий за вас, но вам нужно написать сценарий-оболочку для useradd
, который будет передавать необходимые флаги и переменные в команду.
Вероятно, существует более простой способ последовательного подстановки имен файлов с помощью zsh, но вот -метод грубой силы в bash:
for script in ?.script*.sh ??.script*.sh ???.script*.sh ????.script*.sh
do
printf "Executing script: %s\n" "$script"
./"$script"
done
Это предполагает, что у вас есть не более 9999 скриптов --или, точнее, ни одного с более чем 4 цифрами (символов )в префиксной части имени файла.
Также предполагается, что префиксы пронумерованы--он будет подбирать скрипты с именами, например. go.script_X.sh
, если он у вас есть. Чтобы обойти , что ,замените ?
на [0-9]
на:
for f in [0-9].script*.sh [0-9][0-9].script*.sh...
Естественным механизмом подстановки в оболочке будет сортировка результирующих имен файлов в алфавитном порядке, что приводит к их сортировке и по числовым значениям. Различные имена файлов указываются в возрастающем масштабе, так что «9» сортируется перед «101» и т. д.
В zsh объединяйте имена файлов в порядке номеров их префиксов с помощью:
for script in *.script*.sh(oe_'REPLY=${REPLY%%.*}'_n)
do
printf "Executing script: %s\n" "$script"
./"$script"
done
Расширение подстановки сначала выбирает все *.script*.sh
файлы, а затем приказывает o
rder (отсортировать )их с помощью выражения e
, которое извлекает префикс, удаляя как можно больше «точек, следующих за чем угодно", насколько это возможно, и используя n
числовую сортировку.
Если имена файлов простые (без пробелов, без новой строки, без символов, которые ls необходимо кодировать с помощью ?
), тогда, может быть !!, вы можете обойтись:
IFS=$' \t\n'; for s in $(ls -v folder/*.script.sh); do printf '%s\n' "$s"; done
В этом случае ls
будет сортироваться по номеру версии -v
(, очень похожему на числовое значение ).
Но вообще, анализ (обработки )вывода ls
— плохая идея.
Так лучше:
shopt -s nullglob
for s in folder/?{,?{,?{,?}}}.script.sh
do printf '%s\n' "$s"
done
Который будет перечислять (в алфавитном порядке, что эквивалентно числовому порядку, если символы перед .script.sh
являются только числами )по каждому символу до четырех символов (числа ).
Идея состоит в том, что раскрытие фигурных скобок происходит до раскрытия имени пути . Расширение фигурной скобки преобразует и расширяет ?{,?{,?{,?}}}.script.sh
в
?.script.sh ??.script.sh ???.script.sh ????.script.sh
Затем расширение имени пути найдет все файлы, соответствующие каждому шаблону, сортируя каждый шаблон по очереди.
Если ни один из приведенных выше вариантов не подходит, вам нужно будет использоватьsort
:
printf '%s\n' *.script.sh | sort -n | xargs echo
Что становится еще сложнее, если есть префикс folder
:
printf '%s\n' folder/*.script.sh | sort -n -k 1.8 | xargs echo
Где 8 — это количество символов (байтов )в слове folder
и последующем /
плюс один (1 ).
Вам нужно будет заменить echo
на sh
для выполнения каждого скрипта. Это будет работать правильно, если имя файла не содержит символов новой строки.
Если возможно, что имена файлов могут содержать новые строки, используйте это:
printf '%s\0' folder/*.script.sh | sort -zn -k 1.8 | xargs -0 -I{} echo '{}'
Снова замените echo
наsh
(илиbash
)для выполнения сценариев.