Условно в сценарии Linux для цикла - PullRequest
0 голосов
/ 02 декабря 2011

Я пытаюсь создать простой цикл for, который будет принимать все выходные данные команды ls и помещать каждый выход в переменную.пока у меня есть

for i in ls /home/svn
do
    echo $i
done

, но это дает мне ошибку.

Ответы [ 4 ]

5 голосов
/ 02 декабря 2011

Поскольку необходимо выполнить ls:

for i in $(ls ...); do
  echo $i
done

Кроме того, вместо этого вы можете рассмотреть возможность смещения оболочки:

for i in /home/svn/*; do
  echo $i
done

... или find, что позволяет очень тонко выбрать свойства предметов для поиска:

for i in $(find /home/svn -type f); do
  echo $i
done

Кроме того, если вы можете иметь пробелы в сегментах пути или самих именах файлов, используйте цикл while (предыдущий пример настроен):

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##*/}

Для объяснения замены: ## удаляет самый длинный шаблон с передней привязкой из строки, # до первого совпадения с шаблоном, %% самый длинный шаблон с задней привязкой и % первый с задней привязкой полный матч.

1 голос
/ 02 декабря 2011

Вам не нужно использовать ls для просмотра файлов, в этом случае будет работать следующее: for i in /home/svn/*; do echo $i; done

0 голосов
/ 02 декабря 2011

Это потому, что вы делаете это неправильно с самого начала.

for i in /home/svn/*
do
  echo "$i"
done
0 голосов
/ 02 декабря 2011

Вы хотите назначить вывод команды ls для i, поэтому вам нужно заключить его в обратные кавычки или оператор $ ():

for i in $(ls /home/svn)
do
    echo $i
done
...