2013-12-05 1 views
1

Я пытался продемонстрировать использование ассоциативной аранжировки для сбора счетов. Он работает в цикле while, но, похоже, потерял всю свою информацию после цикла while. Что я делаю не так? Для отладки были добавлены все операторы эха, кроме одного в цикле for.Проблема с ассоциативным массивом в скрипте Баша

#!/bin/bash 

declare -A shell_type 

shells=$(cut -d: -f7 /etc/passwd) 
echo "$shells"| 
while read sh 
do 
    if [ -z "${shell_type[$sh]}" ] 
    then 
    shell_type[$sh]=1 
    else 
    let "shell_type[$sh] += 1" 
    fi 
    echo "$sh ${shell_type[$sh]}" 
    echo "${!shell_type[*]}" 
    echo "${shell_type[*]}" 
done 

echo "${shell_type[*]}" 

for var in "${!shell_type[*]}" 
do 
    echo "$var count is ${shell_type[$var]}" 
done 
+0

Если вы используете 4.2 или более позднюю версию, вы можете использовать 'lastt' для последней транзакции, чтобы последняя команда конвейера выполнялась в текущей оболочке (а не на подоболочке), что устраняет вашу проблему. – chepner

ответ

1

Не трубку к вашему while петли, написать это:

while read sh 
do 
    ... 
done < <(cut -d: -f7 /etc/passwd) 

Если вы cmd | while то время как в другом процессе. Он наследует ваши локальные переменные, но не может их изменять. Используя перенаправление ввода, while остается в текущем процессе.

Btw, первый < есть для перенаправления ввода, а <(...) после этого - замена процесса. Вам нужно пространство между ними, иначе оболочка не сможет отделить эти операторы. Подробнее о замещении процесса вы можете прочитать в разделе man bash в разделе Замена процесса.

+0

Спасибо! Я также обнаружил, что мне нужно удалить цитаты вокруг $ {! Shell_type [*]}; иначе он рассматривался как одно значение со встроенными пространствами. Один последующий вопрос: у двух меньших (<) знаков должно быть пространство между ними. Что это за синтаксис? – user2836927

+0

Хороший вопрос! Я добавил объяснение к моему ответу. – janos

+0

Я верю, что ответил на свой вопрос. Первый <является перенаправлением, второй является частью <(), который является заменой процесса. Я нашел, что это Руководство по разработке сценариев Advanced Bash от Mendell Cooper – user2836927