Поскольку другие ответы близки, проблема заключается в том, как цикл обрабатывает выходные данные ls
команды. Когда строка используется в for
цикле в том виде, в котором она у вас есть, строка разбивается на разные слова (в зависимости от значения, IFS
как говорит Даррен) и подвергается глобализации и тому подобному. Это означает, что вы передаете строку, которая разделяется как на строку, так и на пробелы в строке, а затем каждое из этих слов в свою очередь устанавливается pic
.
Предложение Камиля решает эту проблему, потому что вы позволяете глобусу расширяться до всех имен файлов напрямую, а затем назначается все имя файла pic
.
Это разделение слов произойдет везде, где вы будете использовать pic
переменную позже, поэтому, если вы не хотите, чтобы это произошло, обязательно поставьте двойные кавычки вокруг нее. Например,
for pic in *; do printf '%s\n' "$pic" done
напечатать каждое из имен, по одному в строке.