Как портировать в массивы в стиле bash в пепел?

В последних версиях GNU coreutils вы можете использовать опцию --max-depth вместо перечисления файлов с помощью *. Таким образом, вы не рискуете столкнуться с ограничением длины командной строки, если файлов будет слишком много. Не существует --min-depth, поэтому каталог верхнего уровня будет перечислен в конце.

du -x -d 1 | head -n -1 | sort -r | head -n 10

10
27.12.2017, 15:25
3 ответа

Если вам нужно обратиться к списку услуг только один раз, вы можете использовать здесь -документ:

while IFS= read -r service
do
   START "$service"
done << END
service1.service
service2.service
service3.service
END

Обратите внимание, что имена сервисов в списке не должны заключаться в кавычки. (хотя "$service", вероятно, следует цитировать, если у вас нет веской причины не ). Если вы хотите, чтобы имена сервисов были с отступом, используйте <<-вместо <<и отступы имен с помощью табуляции:

while IFS= read -r service
do
   START "$service"
done <<- END
        service1.service
        service2.service
        service3.service
END
3
27.01.2020, 20:02

До того, как массивы были в bash, kshи других оболочках, обычным методом было выбрать разделитель, которого не было ни в одном из элементов (или тот, который был необычным, чтобы свести к минимуму любое требуемое экранирование )и перебрать строку, содержащую все элементы, разделенные этим разделителем. Пробелы обычно являются наиболее удобным выбором разделителя, потому что оболочка уже по умолчанию разбивает «слова» по пробелам (. Вы можете установить IFS, если хотите, чтобы они разбивались на что-то другое ).

Например:

# backslash-escape any non-delimiter whitespace and all other characters that
# have special meaning to the shell, e.g. globs, parenthesis, ampersands, etc.
services='service1.service service2.service service3.service'

for s in $services ; do  # NOTE: do not double-quote $services here.
  START "$s"
done

$servicesдолжно НЕ быть двойным -, цитируемым здесь, потому что мы хотим, чтобы оболочка разбивала его на «слова».

11
27.01.2020, 20:02

у ash нет массивов. Единственное, что близко, это позиционные параметры, так что вы можете сделать

set -- "service1.service" \
       "service2.service" \
       "service3.service"

for service in "$@"
do
   START $service
done
3
27.01.2020, 20:02

Теги

Похожие вопросы