Элементы списка с пробелами в zsh

Использовать useradd на Linux, по крайней мере.

Использовать crypt(3) для генерации зашифрованного пароля, и затем делают следующее для каждого:

useradd -m -g [group] -p [crypt output] [user]

-m создает корневой каталог. -g устанавливает начальную группу входа в систему пользователя. -p устанавливает зашифрованный пароль, как возвращено crypt(3) (необходимо отметить, что эта опция может быть неподходящей, поскольку зашифрованный пароль будет видим пользователям, перечисляющим процессы, когда пользователь будет создан).

Вы, вероятно, захотите использовать другие опции также (в предположении, по крайней мере -s), читайте man 8 useradd для тех.

10
13.01.2012, 03:17
2 ответа

Во-первых, я предполагаю что использование ls просто пример. Вы не можете проанализировать вывод ls в любой оболочке, потому что это неоднозначно. Читайте, Почему Вы не должны анализировать вывод ls (1), если это - новости Вам. В любой оболочке, для получения списка файлов, подстановочных знаков использования, например. files=(*).

В zsh, как в других оболочках, результат замены команды разделяется на слова в пробельных символах (более точно, согласно значению IFS). (В отличие от других оболочек, результат замены команды не подвергается globbing в zsh.) Поэтому, если вывод ls команда

hello world
wibble

затем files=($(ls)) наборы files массив для содержания 3 элементов: hello, world и wibble.

Если замена команды находится в двойных кавычках, то никакое разделение не выполняется. Можно выполнить пользовательское разделение с флагами расширения параметра. Используйте @ флаг, чтобы указать, что результатом разделения должен быть массив (странно, необходимо сохранить расширение в двойных кавычках, т.е. "${(@)…}", даже при том, что дважды заключенная в кавычки строка расширится до нескольких слов). Для разделения используйте s флаг, например. "${(@s:,:)…}" разделять в запятых; f отметьте разделения в новых строках только.

files=("${(@f)$(ls)}")

Обратите внимание, что надлежащий способ выполнить итерации по массиву в целом for f in $files[@], как $files снимает изоляцию с пустых элементов (здесь, это не имеет значения, потому что элементы не будут пусты).

print $f интерпретирует $f как переключатель, если это начинается с a - и разворачивает обратные косые черты в $f. Использовать print -r -- $f, или print -rn -- $f если Вы не хотите добавлять новую строку после строки.

12
27.01.2020, 20:01
  • 1
    . Да, ls был просто примером. Не было никакой определенной цели в памяти в данный момент, я просто хочу знать, как заключить в кавычки или выйти из элементов списка из любой команды, которая могла бы иметь отдельные результаты с пробелом в них. –  Felix 16.01.2012, 20:17
  • 2
    Одна вещь, которую я нахожу сбивающими с толку, состоит в том, почему внешнее () в Ваших файлах = (" $ {(@f) $ (ls)} "), выражение необходимо с @f? И просто проигрывание вокруг (f), кажется, хорошо работает, пока () появляются на внешней стороне. –  Koobz 26.11.2012, 08:05
  • 3
    @Koobz 1. Внешнее (…) необходимы так, чтобы files массив и не строка (который содержал бы конкатенацию строк от команды, отменяя разделение, сделанное (f)). 2. С foo=$'one\n\nthree', contrast распечатайте-rl $ {(f) нечто}' и print "${(@f)foo}". Двойные кавычки необходимы для сохранения пустых строк, от которых Вы не доберетесь ls но может произойти с другими командами. Париж –  Gilles 'SO- stop being evil' 26.11.2012, 14:35
  • 4
    Очень ценивший. Есть ли какая-либо рифма или причина для этого безумия? Даже там, то, что сбивает с толку, - то, почему не делает внешнего (), просто повторно разделяет строку на отдельных словах снова, если промежуточное значение является моей сцепленной строкой. Это похоже на строковую интерполяцию в рубине или php, например. –  Koobz 28.11.2012, 06:21
  • 5
    @Koobz причина специального режима пустых слов является исторической совместимостью с давно забытыми более старыми версиями zsh. Причина того, чтобы не автоматически разделить состоит в том, что это - удивление и часто не желательное поведение. Автоматическое разделение является поведением Оболочки Bourne, которую не эмулирует zsh, если Вы не говорите это. –  Gilles 'SO- stop being evil' 28.11.2012, 12:20

В zsh можно использовать расширение оболочки, которое не выполняет слово, разделяющее по умолчанию. Попробовать

for f in /path/to/files/*; do
    print ${f}
done
2
27.01.2020, 20:01

Теги

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