удар в то время как заявление - PullRequest
2 голосов
/ 11 января 2012

У меня есть 2 разных скрипта, которые делают в основном одно и то же: подсчет подкаталогов в текущем каталоге:

c=0

ls -l | grep "^d" | while read zeile
do
    c=`expr $c + 1`
    echo $c
done

echo "Subdirs: $c"

и

c=0

while read zeile
do
    c=`expr $c + 1`
    echo $c
done < <(ls -l | grep "^d")

echo "Subdirs: $c"

Моя проблема в том, что в первой версии"c", кажется, теряет свое значение после завершения цикла while.

Выходные данные

1)

1
2
3
Subdirs: 0

2)

1
2
3
Subdirs: 3

Может ли кто-нибудь из вас объяснить мне, почему это происходит?

Заранее спасибо, Алекс

Ответы [ 3 ]

3 голосов
/ 11 января 2012

В первом случае присваивание c происходит после |, то есть в подоболочке. Вы не можете изменить переменную в родительской оболочке из подоболочки. Кстати, почему вы не используете let c++ вместо обратных кавычек и expr?

1 голос
/ 11 января 2012

Если мне нужно сосчитать подкаталоги, я бы использовал одну из следующих 2 команд:

find . -regex ".\{2,\}" -maxdepth 1 -type d | wc -l
ls -l | grep "^d" | wc -l
0 голосов
/ 11 января 2012

Вы не должны использовать ls таким образом .

Вы должны использовать цикл for и глобус для перебора файлов или каталогов.

for f in *
do
    if [[ -d $f ]]
    then
        (( c++ ))
    fi
done
echo "Subdirs: $c"

или

for f in */
do
    (( c++ ))
done
echo "Subdirs: $c"

Вот хакерский путь:

arr=(*/); echo "Subdirs: ${#arr[@]}"

Возможно, вы захотите использовать nullglob и dotglob с любым из вышеперечисленных. См. BashFAQ / 004 для получения дополнительной информации.

Чороба прав в отношении вопроса о подоболочке.

...