link:
https://www.opennet.ru/docs/RUS/bash_scripting_guide/c118.html
1.
Напишите сценарий, который выводит дату, время, список зарегистрировавшихся пользователей, и uptime системы и сохраняет эту информацию в системном журнале. тупо: cat > 1.sh << "EOF" #!/bin/bash #set -x LOG="log.txt" echo "Текущая дата:" >> $LOG date >> $LOG echo "" >> $LOG echo "Пользователи в системе:" >>$LOG w >> $LOG echo "" >> $LOG echo "Нагрузка на систему:" >> $LOG uptime >> $LOG echo "" >> $LOG EOF доработаем: cat > 1m.sh << "EOF" #!/bin/bash #set -x LOG="log.txt" i=zero for i in date w uptime; do if [[ "$i" == "date" ]]; then echo "Текущая дата:" >> $LOG $i >> $LOG elif [[ "$i" == "w" ]]; then echo "Пользователи в системе:" >>$LOG $i >> $LOG elif [[ "$i" == "uptime" ]]; then echo "Нагрузка на систему:" >> $LOG $i >> $LOG fi done EOF Доработаем еще: cat > 1mm.sh << "EOF" #!/bin/bash #set -x LOG="log.txt" # Определяем заголовки как переменные date_header="Текущая дата:" w_header="Пользователи в системе:" uptime_header="Нагрузка на систему:" # Очищаем лог перед записью ###> "$LOG" for command in date w uptime; do # Получаем имя заголовка динамически header_var="${command}_header" # Выводим заголовок echo "${!header_var}" >> "$LOG" # Выполняем команду $command >> "$LOG" done EOF Доработаем еще и еще: cat > 1mmm.sh << "EOF" #!/bin/bash LOG="log.txt" #> "$LOG" declare -A headers=( [date]="Текущая дата:" [w]="Пользователи в системе:" [uptime]="Нагрузка на систему:" ) for cmd in date w uptime; do echo "" >> "$LOG" echo "${headers[$cmd]}" >> "$LOG" $cmd >> "$LOG" done EOF
Специальное назначение некоторых экранированных символов используемых совместно с echo и sed:
\n перевод строки (новая строка) \r перевод каретки \t табуляция \v вертикальная табуляция \b забой (backspace) \a "звонок" (сигнал) \0xx ASCII-символ с кодом 0xx в восьмеричном виде)
завершение / код завершения
echo hello echo $? # код возврата = 0, поскольку команда выполнилась успешно. lskdf # Несуществующая команда. echo $? # Ненулевой код возврата, поскольку команду выполнить не удалось. echo exit 113 # Явное указание кода возврата 113. # Проверить можно, если набрать в командной строке "echo $?" # после выполнения этого примера. # В соответствии с соглашениями, 'exit 0' указывает на успешное завершение, #+ в то время как ненулевое значение означает ошибку.
Использование символа ! для логической инверсии кода возврата:
true # встроенная команда "true". echo "код возврата команды \"true\" = $?" # 0 ! true echo "код возврата команды \"! true\" = $?" # 1 # Обратите внимание: символ "!" от команды необходимо отделять пробелом. # !true вызовет сообщение об ошибке "command not found
Операции проверки файлов:
Возвращает true если... -e файл существует -f обычный файл (не каталог и не файл устройства) -s ненулевой размер файла -d файл является каталогом -b файл является блочным устройством (floppy, cdrom и т.п.) -c файл является символьным устройством (клавиатура, модем, звуковая карта и т.п.) -p файл является каналом -h файл является символической ссылкой -L файл является символической ссылкой -S файл является сокетом -t файл (дескриптор) связан с терминальным устройством Этот ключ может использоваться для проверки -- является ли файл стандартным устройством ввода stdin ([ -t 0 ]) или стандартным устройством вывода stdout ([ -t 1 ]). -r файл доступен для чтения (пользователю, запустившему сценарий) -w файл доступен для записи (пользователю, запустившему сценарий) -x файл доступен для исполнения (пользователю, запустившему сценарий) -g set-group-id (sgid) флаг для файла или каталога установлен Если для каталога установлен флаг sgid, то файлы, создаваемые в таком каталоге, наследуют идентификатор группы каталога, который может не совпадать с идентификатором группы, к которой принадлежит пользователь, создавший файл. Это может быть полезно для каталогов, в которых хранятся файлы, общедоступные для группы пользователей. -u set-user-id (suid) флаг для файла установлен Установленный флаг suid приводит к изменению привилегий запущенного процесса на привилегии владельца исполняемого файла. Исполняемые файлы, владельцем которых является root, с установленным флагом set-user-id запускаются с привилегиями root, даже если их запускает обычный пользователь. [1] Это может оказаться полезным для некоторых программ (таких как pppd и cdrecord), которые осуществляют доступ к аппаратной части компьютера. В случае отсутствия флага suid, программы не смогут быть запущены рядовым пользователем, не обладающим привилегиями root. -rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd Файл с установленным флагом suid отображается с включенным флагом s в поле прав доступа. -k флаг sticky bit (бит фиксации) установлен Общеизвестно, что флаг "sticky bit" -- это специальный тип прав доступа к файлам. Программы с установленным флагом "sticky bit" остаются в системном кэше после своего завершения, обеспечивая тем самым более быстрый запуск программы. [2] Если флаг установлен для каталога, то это приводит к ограничению прав на запись. Установленный флаг "sticky bit" отображается в виде символа t в поле прав доступа. drwxrwxrwt 7 root 1024 May 19 21:26 tmp/ Если пользователь не является владельцем каталога, с установленным "sticky bit", но имеет право на запись в каталог, то он может удалять только те файлы в каталоге, владельцем которых он является. Это предотвращает удаление и перезапись "чужих" файлов в общедоступных каталогах, таких как /tmp. -O вы являетесь владельцем файла -G вы принадлежите к той же группе, что и файл -N файл был модифицирован с момента последнего чтения f1 -nt f2 файл f1 более новый, чем f2 f1 -ot f2 файл f1 более старый, чем f2 f1 -ef f2 файлы f1 и f2 являются "жесткими" ссылками на один и тот же файл ! "НЕ" -- логическое отрицание (инверсия) результатов всех вышеприведенных проверок (возвращается true если условие отсутствует). [ $# -eq 0 ] && directorys=`pwd` || directorys=$@
Операции сравнения:
Сравнение целых чисел: -eq равно if [ "$a" -eq "$b" ] -ne не равно if [ "$a" -ne "$b" ] -gt больше if [ "$a" -gt "$b" ] -ge больше или равно if [ "$a" -ge "$b" ] -lt меньше if [ "$a" -lt "$b" ] -le меньше или равно if [ "$a" -le "$b" ] < меньше (внутри двойных круглых скобок ) (("$a" < "$b")) <= меньше или равно (внутри двойных круглых скобок) (("$a" <= "$b")) > больше (внутри двойных круглых скобок) (("$a" > "$b")) >= больше или равно (внутри двойных круглых скобок) (("$a" >= "$b")) Сравнение строк: = равно if [ "$a" = "$b" ] == равно if [ "$a" == "$b" ] Синоним оператора =. [[ $a == z* ]] # истина, если $a начинается с символа "z" (сравнение по шаблону) [[ $a == "z*" ]] # истина, если $a равна z* [ $a == z* ] # имеют место подстановка имен файлов и разбиение на слова [ "$a" == "z*" ] # истина, если $a равна z* != не равно if [ "$a" != "$b" ] Этот оператор используется при поиске по шаблону внутри [[ ... ]]. < меньше, в смысле величины ASCII-кодов if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] Обратите внимание! Символ "<" необходимо экранировать внутри [ ]. > больше, в смысле величины ASCII-кодов if [[ "$a" > "$b" ]] if [ "$a" \> "$b" ] Обратите внимание! Символ ">" необходимо экранировать внутри [ ]. См. Пример 25-6 относительно применения этого оператора сравнения. -z строка "пустая", т.е. имеет нулевую длину -n строка не "пустая".