LS Conditional в сценарии Linux для цикла
Вопрос
Я пытаюсь создать простой for
цикл, который возьмет все результаты ls
команда и поместите каждый вывод в переменную. Пока что у меня есть
for i in ls /home/svn
do
echo $i
done
Но это дает мне ошибку.
Решение
Поскольку ls
нужно выполнить:
for i in $(ls ...); do
echo $i
done
Кроме того, вы можете вместо этого рассмотреть Shell Globing:
for i in /home/svn/*; do
echo $i
done
... или же find
, что позволяет найти очень мелкозернистый выбор свойств элементов:
for i in $(find /home/svn -type f); do
echo $i
done
Кроме того, если вы можете иметь место в белом месте в сегментах пути или сами имена файлов, используйте цикл WINT (предыдущий пример, скорректированный):
find /home/svn -type f|while read i; do
echo $i
done
while
читает по линейке, так что белое пространство сохранилось.
Относительно призывов basename
у вас есть два варианта:
# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}
Чтобы объяснить замену: ##
Удаляет самый длинный передний запор из строки, #
вплоть до первого матча, %%
самый длинный закрепленный шаблон и %
Первый полный матч с задней частью.
Другие советы
Вам не нужно использовать ls
Чтобы пройти файлы в этом случае, следующее сделает задание: for i in /home/svn/*; do echo $i; done
Вы хотите назначить вывод команды LS I, поэтому вам нужно приложить его в обратные вызовы или оператор $ ():
for i in $(ls /home/svn)
do
echo $i
done
Это потому, что вы делаете это неправильно в первую очередь.
for i in /home/svn/*
do
echo "$i"
done