Вопрос

Я пытаюсь создать простой 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top