Литмир - Электронная Библиотека
Содержание  
A
A

        if [[ $(id -u) -eq 0 ]]; then

                cat <<- _EOF_

                        <H2>Home Space Utilization (All Users)</H2>

                        <PRE>$(du -sh /home/*)</PRE>

                        _EOF_

        else

                cat <<- _EOF_

                        <H2>Home Space Utilization ($USER)</H2>

                        <PRE>$(du -sh $HOME)</PRE>

                        _EOF_

        fi

        return

}

Теперь мы можем переписать ее, добавив вывод информации о домашнем каталоге каждого пользователя и включив в вывод общее число файлов и подкаталогов в каждом из них:

report_home_space () {

        local format="%8s%10s%10s\n"

        local i dir_list total_files total_dirs total_size user_name

        if [[ $(id -u) -eq 0 ]]; then

                dir_list=/home/*

                user_name="All Users"

        else

                dir_list=$HOME

                user_name=$USER

        fi

        echo "<H2>Home Space Utilization ($user_name)</H2>"

        for i in $dir_list; do

                total_files=$(find $i -type f | wc -l)

                total_dirs=$(find $i -type d | wc -l)

                total_size=$(du -sh $i | cut -f 1)

                echo "<H3>$i</H3>"

                echo "<PRE>"

                printf "$format" "Dirs" "Files" "Size"

                printf "$format" "----" "-----" "----"

                printf "$format" $total_dirs $total_files $total_size

                echo "</PRE>"

        done

        return

}

В этой новой версии применено многое из того, что мы узнали к данному моменту. Она все еще проверяет наличие привилегий суперпользователя, но вместо того, чтобы выполнить полный набор операций в каждой из ветвей if, здесь устанавливаются некоторые переменные, которые затем используются в цикле for. В функции использованы несколько локальных переменных и команда printf для форматирования части вывода.

34. Строки и числа

Любые компьютерные программы обрабатывают данные. В предыдущих главах основное внимание уделялось обработке данных на уровне файлов. Однако многие задачи решаются с использованием меньших единиц данных, таких как строки и числа.

В этой главе мы рассмотрим некоторые возможности командной оболочки для работы со строками и числами. Командная оболочка поддерживает большое разнообразие способов подстановки параметров, которые выполняют строковые операции. В дополнение к подстановке результатов арифметических выражений (о которой рассказывалось в главе 7) существует программа командной строки bc, выполняющая математические операции.

Подстановка параметров

Механизм подстановки параметров уже рассматривался в главе 7, но там этот механизм не был описан детально, потому что большая часть его возможностей используется в сценариях, а не в командной строке. Мы уже знакомы с некоторыми формами подстановки параметров, например с подстановкой значений переменных командной оболочки. Но в командной оболочке их намного больше.

Простые параметры

Простейшую форму подстановки параметров можно наблюдать в использовании переменных. Например, запись $a после подстановки превращается в содержимое переменной a. Простые параметры можно заключать в фигурные скобки, например: ${a}. Это не оказывает влияния на результат подстановки, но является необходимым, если сразу за именем переменной следует какой-то другой текст, который может сбивать с толку командную оболочку. В следующем примере выполняется попытка сконструировать имя файла добавлением строки _file к содержимому переменной a.

[me@linuxbox ~]$ a="foo"

[me@linuxbox ~]$ echo "$a_file"

Если выполнить эту последовательность команд, результатом будет пустое значение, потому что командная оболочка попытается выполнить подстановку значения переменной a_file вместо a. Эта проблема устраняется с помощью фигурных скобок:

[me@linuxbox ~]$ echo "${a}_file"

foo_file

Мы видели также, что доступ к позиционным параметрам с порядковыми номерами выше 9 тоже осуществляется с помощью фигурных скобок. Например, прочитать 11-й позиционный параметр можно следующим образом: ${11}.

Подстановка пустых переменных

Некоторые формы подстановки параметров помогают решать проблемы с несуществующими, или пустыми, переменными. Эти формы удобно использовать для обработки ситуаций отсутствия позиционных параметров и назначения им значений по умолчанию. Ниже приводится пример такой подстановки:

${параметр:-слово}

Если параметр не определен (то есть отсутствует) или содержит пустое значение, механизм подстановки вернет значение указанного слова. Если параметр не пустой, механизм подстановки вернет значение параметра.

[me@linuxbox ~]$ foo=

[me@linuxbox ~]$ echo ${foo:-"substitute value if unset"}

substitute value if unset

[me@linuxbox ~]$ echo $foo

[me@linuxbox ~]$ foo=bar

[me@linuxbox ~]$ echo ${foo:-"substitute value if unset"}

bar

[me@linuxbox ~]$ echo $foo

bar

Вот еще один вариант подстановки, где вместо дефиса используется знак «равно»:

${параметр:=слово}

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

[me@linuxbox ~]$ foo=

[me@linuxbox ~]$ echo ${foo:="default value if unset"}

default value if unset

[me@linuxbox ~]$ echo $foo

default value if unset

[me@linuxbox ~]$ foo=bar

[me@linuxbox ~]$ echo ${foo:="default value if unset"}

bar

[me@linuxbox ~]$ echo $foo

bar

ПРИМЕЧАНИЕ

Таким способом нельзя присваивать значения позиционным и другим специальным параметрам.

Ниже демонстрируется форма со знаком вопроса:

${параметр:?слово}

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

[me@linuxbox ~]$ foo=

[me@linuxbox ~]$ echo ${foo:?"parameter is empty"}

bash: foo: parameter is empty

[me@linuxbox ~]$ echo $?

1

[me@linuxbox ~]$ foo=bar

[me@linuxbox ~]$ echo ${foo:?"parameter is empty"}

bar

[me@linuxbox ~]$ echo $?

0

Ниже демонстрируется форма со знаком «плюс»:

${параметр:+слово}

Если параметр не определен или содержит пустое значение, механизм подстановки вернет пустое значение. Если параметр не пустой, механизм подстановки вернет значение слова, но сам параметр не изменится.

[me@linuxbox ~]$ foo=

[me@linuxbox ~]$ echo ${foo:+"substitute value if set"}

[me@linuxbox ~]$ foo=bar

[me@linuxbox ~]$ echo ${foo:+"substitute value if set"}

substitute value if set

Получение имен переменных

Командная оболочка может возвращать имена переменных. Это используется в некоторых экзотических ситуациях.

105
{"b":"568756","o":1}