Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

# =================================================================

# Стандартная проверка аргументов

ARGS=1

E_BADARGS=65

E_NOFILE=66

if [ $# -ne $ARGS ] # Проверка числа аргументов

then

echo "Порядок использования: `basename $0` имя_файла"

exit $E_BADARGS

fi

if [ -f "$1" ] # Проверка наличия файла.

then

file_name=$1

else

echo "Файл \"$1\" не найден."

exit $E_NOFILE

fi

# =================================================================

MAXWIDTH=70 #

Максимальная длина строки.

# Удаление символов "^" начиная с первого символа строки,

#+ и ограничить длину строки 70-ю символами.

sed '

s/^>//

s/^ *>//

s/^ *//

s/ *//

' $1 | fold -s --width=$MAXWIDTH

# ключ -s команды "fold" разрывает, если это возможно, строку по пробельному символу.

# Этот сценарий был написан после прочтения статьи, в котором расхваливалась

#+ утилита под Windows, размером в 164K, с подобной функциональностью.

#

# Хороший набор утилит для обработки текста и эффективный

#+ скриптовый язык -- это все, что необходимо, чтобы составить серьезную конкуренцию

#+ чрезмерно "раздутым" программам.

exit 0

Пример A-3. rn: Очень простая утилита для переименования файлов

Этот сценарий является модификацией Пример 12-15.

#! /bin/bash

#

# Очень простая утилита для переименования файлов

#

# Утилита "ren", автор Vladimir Lanin (lanin@csd2.nyu.edu),

#+ выполняет эти же действия много лучше.

ARGS=2

E_BADARGS=65

ONE=1 # Единственное или множественное число (см. ниже).

if [ $# -ne "$ARGS" ]

then

echo "Порядок использования: `basename $0` старый_шаблон новый_шаблон"

# Например: "rn gif jpg", поменяет расширения всех файлов в текущем каталоге с gif на jpg.

exit $E_BADARGS

fi

number=0 # Количество переименованных файлов.

for filename in *$1* # Проход по списку файлов в текущем каталоге.

do

if [ -f "$filename" ]

then

fname=`basename $filename` # Удалить путь к файлу из имени.

n=`echo $fname | sed -e "s/$1/$2/"` # Поменять старое имя на новое.

mv $fname $n # Переименовать.

let "number += 1"

fi

done

if [ "$number" -eq "$ONE" ] # Соблюдение правил грамматики.

then

echo "$number файл переименован."

else

echo "Переименовано файлов: $number."

fi

exit 0

# Упражнения:

# ----------

# С какими типами файлов этот сценарий не будет работать?

#

Как это исправить?

#

# Переделайте сценарий таким образом, чтобы он мог обрабатывать все файлы в каталоге,

#+ в именах которых содержатся пробелы, заменяя пробелы символом подчеркивания.

Пример A-4. blank-rename: переименование файлов, чьи имена содержат пробелы

Это даже более простая версия предыдущего примера.

#! /bin/bash

# blank-rename.sh

#

# Заменяет пробелы символом подчеркивания в именах файлов в текущем каталоге.

ONE=1 # единственное или множественное число (см. ниже).

number=0 # Количество переименованных файлов.

FOUND=0 # Код завершения в случае успеха.

for filename in * # Перебор всех файлов в текущем каталоге.

do

echo "$filename" | grep -q " " # Проверить -- содержит ли имя файла

if [ $?
– eq $FOUND ] #+ пробелы.

then

fname=$filename # Удалить путь из имени файла.

n=`echo $fname | sed -e "s/ /_/g"` # Заменить пробелы символом подчеркивания.

mv "$fname" "$n" # Переименование.

let "number += 1"

fi

done

if [ "$number" -eq "$ONE" ]

then

echo "$number файл переименован."

else

echo "Переименовано файлов: $number"

fi

exit 0

Пример A-5. encryptedpw: Передача файла на ftp-сервер, с использованием пароля

#!/bin/bash

# Модификация примера "ex72.sh", добавлено шифрование пароля.

# Обратите внимание: этот вариант все еще нельзя считать безопасным,

#+ поскольку в сеть пароль уходит в незашифрованном виде.

# Используйте "ssh", если вас это беспокоит.

E_BADARGS=65

if [ -z "$1" ]

then

echo "Порядок использования: `basename $0` имя_файла"

exit $E_BADARGS

fi

Username=bozo # Измените на свой.

pword=/home/bozo/secret/password_encrypted.file

# Файл, содержащий пароль в зашифрованном виде.

Filename=`basename $1` # Удалить путь из имени файла

Server="XXX"

Directory="YYY" # Подставьте фактические имя сервера и каталога.

Password=`cruft <$pword` # Расшифровка.

# Используется авторская программа "cruft",

#+ основанная на алгоритме "onetime pad",

#+ ее можно скачать с :

#+ Primary-site: ftp://ibiblio.org/pub/Linux/utils/file

#+ cruft-0.2.tar.gz [16k]

ftp -n $Server <<End-Of-Session

Поделиться с друзьями: