LINUX.ORG.RU

Получить список заблокированных пользователей

 ,


1

2

пытаюсь в массив получить список заблокированных пользователей таким образом:

a=0
declare -a m
cat /etc/shadow | awk -F: '{ print $1 " " $2; }' | while read user passw; do
  if [[ ${passw:0:1} == "!" ]]; then
    m[$a]=$user
    let "a += 1"
  fi
done
echo ${m[0]} 
получается, что внутри цикла в массиве значения в массив присваиваются (проверял вставляя там вывод на экран), а за пределами цикла массив уже пустой... может быть есть какой-нить другой способ получить заблокированных пользователей ? подскажите плиз...


старый башевский прикол, что если делаешь cat | while read ... do .. variable=... done ; то выходя из цикла своя область видимости, и внутрицикловые переменные теряются.
надо делать так:
while read ... do .. variable=... done < /etc/shadow

bl ★★★
()

1. Переменные надо экранировать: "$user", "${passw:0:1}";

2. "m[$a]" надо экранировать, т.к. квадратные скобки будут восприняты как части маски файла, если он существует;

3. Добавить элемент в массив: m+=("$user");

4. awk сам умеет читать из файлов: awk -F: ... /etc/shadow.

5. Считать строку без экранирования и пропуска начальных и конечных пробельных символов: IFS= read -r user passwd.

6. См. По башу, видимость переменных внутри цикла — пайпы — отдельные процессы, работающие параллельно; можно сделать вот так:

while ...; do
    ...
done < <(some_command)
вместо some_command | while .....

sshvabodka
()

В данном примере достаточно добавить в начало 'shopt -s lastpipe'.
А вообще-то трудно придумать, как употребить такое количество ненужного для такой простой задачи.

ABW ★★★★★
()
Ответ на: комментарий от Lavos

Круто !!!

Lavos - ты гений :)

bl и sshvabodka - тоже спасибо за ценную инйормацию !!

chirs
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.