2016-04-25 3 views
0

Хорошо, я задал вопрос о неделю назад и получил ответ, который работает, но не решает мою проблему. Я новичок в KSH. Также было бы полезно пояснить, что я бы предпочел начать отправку или где-то начать читать, а не писать код. :) Я хочу, чтобы закончить продукт выглядеть следующим образом:Получить имя файла из каталога KSH Unix

iter = 1 
do 
    while fileExistsInDir==true 
    $arr[$iter] = filename 
    iter++ 
    done 

#do something with the array 

В моем предыдущем вопросе я сказал, чтобы сделать это

set --* 
[#$var -gt 0]&&{ 
echo $1 
} 

это работало, но $ 1 я должен был держать прирост, т.е. $ 2, $ 3 , $ 4 и так далее. Я хочу, чтобы он оставался статичным и менял значение для каждого файла. Есть ли более простой способ сделать это. все, что я видел в стеке, пока имеет либо необходимые зависимости, либо не работает.

+0

Итак, вы просто хотите, чтобы массив с числовой индексацией содержал имена файлов в текущем каталоге? –

+0

Да довольно много – user3753693

+0

http://stackoverflow.com/a/36754231/3220113 Используемые пространства, помните, что они часто значительны. –

ответ

2

Строка set -- * отображает все файлы в текущей директории в позиционные параметры.

Вы можете перебираем все позиционные параметры с

for file in "[email protected]"; do 
    echo "$file" 
done 
+2

Параметр 'in '$ @" 'является необязательным и по умолчанию. – cdarke

+2

@cdarke Согласен. И, как правило, я бы оставил его, но в этом случае я думал, что добавленная специфика была полезна при заданной настройке позиционных параметров с помощью 'set''. (Хотя было бы более полезно, если бы я вызвал, что '$ @' - это массив позиционных параметров.) –

+0

Спасибо, это объясняет это лучше. Это лучший способ сделать этот процесс? – user3753693

4

Чтобы получить все файлы в текущей директории в массив очень просто:

$ arr=(*) 
$ echo "${arr[@]}" 

* называется Glob построить, но большинство людей называют его подстановочным знаком. Это означает «имена файлов в текущем каталоге с нулем или более символов» (т. Е. Все). Я предполагаю относительно недавнюю версию ksh. На протяжении многих лет работа с массивами в корпусе Korn.

+0

Является ли это лучше, чем то, что я делаю сейчас, используя набор? – user3753693

+1

Это проще, и просто хорошо. https://en.wikipedia.org/wiki/KISS_principle У некоторых людей проблемы с использованием 'set' - я этого не делаю. Есть несколько неясных проблем с 'set', но выбирать между методами не так много. – cdarke

+1

Если вы используете оболочку без массивов, то необходимо использовать 'set'. Проблемы с использованием 'set' заключаются в том, что он сдувает любые позиционные параметры, которые получил ваш скрипт/функция, если вам все еще нужны проблемы. Если у вас есть массивы, то использование 'set' является опцией, но использование массива работает так же хорошо (и у вас их больше для игры). –

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