Я пытаюсь перечислить все скрытые каталоги с помощью цикла «for»:
for i in ``ls -a | grep '^\.'` `;
do
echo $i
done
Проблема в том, что цикл делит некоторые имена каталогов на две части.
Например: ls -a | grep '^\.'
дает мне
.
..
.Deleted Items
.Drafts
.Junk
.Junk E-mail
.Sent
.Sent Items
.Trash
Но мой цикл дает мне:
.
..
.Deleted
Items
.Drafts
.Junk
.Junk
E-mail
.Sent
.Sent
Items
.Trash
Как мне улучшить мой скрипт, чтобы он не разделял имена каталогов?
Вам не нужен ls
команда, поскольку оболочка сделает расширение за вас, и вы должны указать "
переменная
for i in .*/
do
echo "$i"
done
Если нет особой потребности в 'for', вы можете попробовать цикл while:
ls -d .* | while read Name
do
echo "$Name"
done
Есть множество способов обойти это, от поиска до дополнительных цитат и т. Д.
Лично я считаю полезным изменить переменную IFS. IFS используется для определения символа разрыва между элементами списка для for
и тому подобное. Итак, установите IFS как новую строку через IFS=$'\n'
. Это сделает for
цикл чтения до конца строки ввода, прежде чем начать новый элемент в его списке. Возможно, это не самый простой способ решить эту конкретную проблему (ответ Иана более элегантен), но я нашел его весьма полезным в ряде ситуаций.
Несколько дней назад я столкнулся с аналогичной проблемой и эта тема было очень полезно. Надеюсь, вы найдете там вдохновение.