2013-11-26 3 views
0

Я пытаюсь получить basename из цикла, но это только возвращает меня "*".Bash - получить basename из цикла

FILES=("/home/aaaa/bbbb/*") #Get all folders 
for f in "${FILES[@]}" 
do 
    basename "$f" 
done 

Что я делаю неправильно?

+0

рассматривающие любой один из ответа как решение по вашему запросу, делает прямо "ls -1/home/aaaa/bbbb /" не приводит к ожидаемому результату? – user1587504

ответ

4

Используя ("/home/aaaa/bbbb/*"), массив создается только с одной литеральной строкой "/home/aaaa/bbbb/*".

Вместо этого, чтобы избавиться от кавычек и просто сказать:

FILES=(/home/aaa/bbb/*) 
for f in "${FILES[@]}" 
do 
    basename "$f" 
done 
4

Вам даже не нужно создать массив и выполнить свой цикл, как это:

for f in /home/aaaa/bbbb/* 
do 
    # get the basename using pure BASH 
    base="${f##*/}" 
    echo "base is: $base" 
done 
+0

Это прекрасно работает для имен файлов с пробелами. Расширение имени пути происходит после разделения слов. – chepner

+3

Чтобы вернуться к массивам, 'names = (/ home/aaaa/bbbb/*); basenames = ("$ {names [@] ## * /}") 'тоже работает. Никакой явной петли не требуется. – chepner

Смежные вопросы