#linux #bash
#linux #bash
Вопрос:
У меня есть набор файлов в /home/user/ source . Один файл в этом наборе имеет имя ‘e e’ (в одинарных кавычках). Когда я попытался перебрать этот набор файлов и распечатать все имена файлов, я получил этот файл с именем e e (кавычки не были указаны). Как написать этот цикл, чтобы сохранить эти кавычки в выходных данных? Вот код:
#!/bin/bash
for existedFile in "$(ls /home/user/source)"
do
echo $existedFile
done
Запутанный момент здесь, когда я просто использую ls /home/user/source
вывод, правильный.
Комментарии:
1. используйте глобус:
for existedFile in /home/user/source/*; do printf '%sn' "$existedFile"; done
2. в моем случае не работает
3. Сделайте то, что
bash
говорит тег, который вы использовали, и скопируйте / вставьте свой скрипт в shellcheck.net чтобы исправить большинство, если не все ваши проблемы.4. @Alkaf: это создает файл с именем
e e
, кавычки удаляются из командной строки во время удаления кавычек (см.man bash
). Используйтеtouch "'e e'"
илиtouch 'e e'
для создания файла с именем'e e'
.5. @Alkaf «не работает в моем случае» : как так?
Ответ №1:
Вывод ls
может содержать что угодно. Он может содержать пробелы, новые строки, запятые, символы канала и т. Д. Это может быть чрезвычайно вредным в сценарии.
Вместо этого выполните итерацию по глобусу : *
. Звездочка — это сокращение для «все в этом каталоге». Bash позаботится о переборе файлов. Если вам нужно сопоставить определенный тип / шаблон файла, вы можете использовать *.java
file*.f90
, и т.д.