Использование команды read для анализа вывода du -s в сценарии оболочки linux - PullRequest
3 голосов
/ 06 марта 2009

Я пытаюсь написать сценарий оболочки для выполнения действий, если домашний каталог пользователя превышает определенный размер. Когда я пытаюсь использовать команду read, чтобы разделить вывод du -s, я получаю «command not found», поскольку он пытается передать число в оболочку, а не в переменную, как я хочу. Вот что у меня есть для сценария.

#!/bin/bash
cd /home
for i in `ls`
do
    j=`du -s $i`
    #this line gives me the error
    k=`$j |read first;`
done

Я получаю вывод, подобный следующему:

./takehome.sh: line 6: 3284972: command not found

, где 3284972 - размер каталога.

Ответы [ 4 ]

7 голосов
/ 06 марта 2009

Есть как минимум два способа сделать это:

Метод 1:

#!/bin/bash
cd /home
for i in `ls`
do
    set -- `du -s $i`
    size=$1
    name=$2
    ...
done

Метод 2:

#!/bin/bash
cd /home
du -s * |
while read size name
do
    ...
done
7 голосов
/ 06 марта 2009

Я думаю, вы захотите что-то вроде

#!/bin/bash
for i in *
do
    j=`du -s "$i" | cut -f 1`
    echo $i size is $j
done

Чтение в другую переменную, чтение и игра с ней кажутся излишними.

Я считаю, что более элегантным решением является второй метод Джонатана Леффлера (скопированный здесь)

#!/bin/bash
cd /home
du -s * |
while read size name
do
    ...
done
2 голосов
/ 06 марта 2009

Понятно, что это происходит, потому что это то, что вы говорите. Обратные пометки означают: оцените эту строку, запустите ее как команду и дайте мне вывод.

Также read name означает чтение данных в переменную name.

Попробуйте:

echo $j | read k

Или даже удаление предыдущей строки:

du -s $i | read k

( Редактировать - При правильной проверке все работает нормально в ksh, но не в bash по некоторым причинам. Я думаю, что это может быть связано с подоболочками. Используйте обратные метки и cut решение ниже, если вы используете bash.)

Вы можете оставить свои галочки и использовать cut вместо read:

k=`$du -s $i | cut -f1`

В этом случае это, вероятно, не даст вам намного больше, но cut более мощный, чем read, что может помочь вам в будущем.

0 голосов
/ 06 марта 2009

Если вы просто хотите ограничить объем дискового пространства, которое могут использовать пользователи, вы можете проверить концепцию дисковых квот.

Начальная точка: Квота @ LQWiki

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...