Вызов: conv
Пример вызова:
Пример вызова:
Зачем нам нужен dtoh?
Назначение: Переводит входные десятичные числа в выходные восьмеричные.
Синтаксис: DEC="decimal_number"; OCT='.dtoo'
Пример вызова
Назначение Переводит входные шестнадцатиричные числа в выходные десятичные.
Синтаксис: HEX="hex_number"; DEC='.htod'
Пример вызова
Назначение Переводит входные шестнадцатиричные числа в выходные восмеричные.
Синтаксис: HEX="hex_number"; OCT ='.htoo'
Пример вызова
Назначение: Переводит входные восьмеричные числа в выходные десятичные.
Синтаксис: OCT="octal_number"; DEC = '.otod'
Пример вызова
Назначение: Переводит входные восьмеричные числа в выходные шестнадцатиричные.
Синтаксис: OCT="octal_number"; HEX = '.otoh'
Пример вызова
Например:
Введение
Способы преобразования
conv
Назначение: Обеспечивает возможность преобразования основания системы счисления
Исходный текст для функции conv
1 :
2 # @(#) conv v1.0 Преобразование основания системы счисления, используя shell. Автор: Russ Sage
3
4 while :
5 do
6 echo "
7
8 Преобразование оснований
9 ------------------------
10 1 - Десятичное в шестнадцатиричное
11 2 - Шестнадцатиричное в десятичное
12 3 - Десятичное в восьмеричное
13 4 - Восьмеричное в десятичное
14 5 - Восьмеричное в шестнадцатиричное
15 6 - Шестнадцатиричное в восьмеричное
16
17 enter choice (1-6, <>): \c"
18 read CHOICE
19
20 case $CHOICE in
21 "") exit;;
22 1) echo "\nВведите десятичное число (<> to exit): \c"
23 read DEC
24 if [ "$DEC" = ""]
25 then exit
26 fi
27 HEX='. dtoh'
28 echo "\n${DEC}d = ${HEX}x";;
29 2) echo"\nBведите шестнадцатиричное число в верхнем регистре (<> to exit): \c"
30 read HEX
31 if [ "$HEX" = ""]
32 then exit
33 fi
34 DEC='. htod'
35 echo "\n${HEX}x= ${DEC}d;;
36 3) echo "\nBведите десятичное число в верхнем регистре (<> to exit): \c"
37 read DEC
38 if [ "$DEC" = ""]
39 then exit
40 fi
41 OCT='. dtoo'
42 echo "\n${DEC}d = ${OCT}o";;
43 4) echo "\nBведите восьмеричное число (<> to exit): \c"
44 read OCT
45 if [ "$OCT" = ""]
46 then exit
47 fi
48 OCT='. otod'
49 echo "\n${OCT}o = ${DEC}d";;
50 5) echo "\nBведите восьмеричное число (<> to exit): \c"
51 read OCT
52 if [ "$OCT" = ""]
53 then exit
54 fi
55 HEX='. otoh'
56 echo "\n${OCT}o = ${HEX}x";;
57 6) echo "\nBведите шестнадцатиричное число в верхнем регистре (<> to exit): \c"
58 read НЕХ
59 if [ "$НЕX" = ""]
60 then exit
61 fi
62 OCT='. htoo'
63 echo "\n${HEX}x = ${OCT}o";;
64 *) echo "\n$CHOICE-неизвестная команда";;
65 esac
66 done
Модули преобразования
dtoh
Присвоить DEC начальное значение 25, вызвать dtoh для его преобразования и
записать результат в HEX. Вывести результаты на экран.
$DEC="25";HEX='.dtoh'
$echo $HEX
Исходный текст для dtoh
1 :
2 # @(#) dtoh v1.0 Преобразование языка shell--десятичные в шестнадцатиричные Автор: Russ Sage
3
4 bc <
Описание
Что делает dtoh?
Пояснение
Исследования
dtoo
dtoo Десятичные в восьмеричные
Присвоить DEC начальное значение 16, вызвать dtoo для ее
преобразования и записать результат в OCT. Вывести результаты на
экран.Исходный текст для dtoo
1 :
2 # @(#) dtoo v1.0 Преобразование языка shell--десятичные в
восьмеричные Автор: Russ Sage
bc <
Описание
htod
htod Шестнадцатиричные в десятичные
Присвоить HEX шестнадцатиричное значение, преобразовать его, напечатать результаты.Исходный текст для htod
1 :
2 # @(#) dtoo v1.0 Преобразование языка shell--шестнадцатиричные в десятичные Автор: Russ Sage
bc <
htoo
htoo Шестнадцатиричные в восьмеричные
Исходный текст для htoo
1 :
2 # @(#) htoo v1.0 Преобразование с помощью языка shell--шестнадцатиричные в восьмеричные Автор: Russ Sage
bc <
Тонкости bc
otod
otod Восьмеричные в десятичные
Присвоить OCT восьмеричное число, преобразовать его в десятичное, напечатать результат.Исходный текст для otod
1 :
2 # @(#) otod v1.0 Преобразование языка shell--восьмеричные в десятичные Автор: Russ Sage
bc <
otoh
otoh Восьмеричные в шестнадцатиричныеИсходный текст для otoh
1 :
2 # @(#) otoh v1.0 Преобразование с помощью языка shell -- восьмеричные в шестнадцатиричные Автор: Russ Sage
bc <
Хитрости языка shell
Читайте ввод с клавиатуры, пока находитесь в цикле,
присоединенном к програмному каналу
Эта программа отображает на экране список зарегистрировавшихся пользователей и
спрашивает Вас, не хотите ли Вы послать сообщение по почте кому-нибудь из
пользователей. Если Вы отвечаете "Y", команда почты запускается, причем ей на
вход передается имя пользователя, которого Вы выбрали.
who | awk '{ print $1 }' | while read NAME
do
echo "mail to $NAME: \c"
KB = 'Line < /dev/tty'
if [ "$KB" = "y"]
then mail $NAME
fi
done
Запуск дочернего языка shell
sh << !
$@
!
Уровни языка shell и ввод-вывод
где file1, file2 и file3 - вывод команды ls. Все, что мы хотим сделать - это
поместить процесс номер id (в данном случае 1034) в переменную, доступ к которой
мы получим позже. Один интересный момент здесь - если Вы делаете ту же самую
команду внутри командного файла, номер процесса id не печатается.
$ ls &
1034
$ file1
file2
file3
$(ls &) 2 > idfile
где процесс id, переданный kill, генерируется из команды cat, которая печатает
процесс id, захваченный ранее. Это может дать программам опцию "kill self", где
они могут отслеживать их id, чтобы вам не пришлось это делать. Программа watch,
которую мы видели в главе 6 делает нечто подобное.
$ kill -9 'cat idfile'
Встроенный ввод
С редактором ed
В этом примере редактируется файл под названием "file" и над ним выполняется
несколько команд. Первая команда говорит "От первой строки до последней, для
каждой строки, имеющей пустые символы в начале строки, за которыми следует любое
количество таких же символов, заменить эти символы "ничем". Запишите файл и
выйдите." Эта процедура удаляет пробелы из начала строки.
ed file << -!
1, \$s/^ *//
w
q
!
С файлом a.out
$ (a.out < text
> input
> lines
> !
) | more
C архивами языка shell
$ cat archive
#
# Это архивный файл текстовых файлов 1, 2 и 3
#
echo "извлекаем текстовый файл 1"
cat > text1.sh << !
#
# Это пример текстового файла 1
#
who | sort
!
echo "извлекаем текстовый файл 2"
cat > text2 << !
Это содержимое второго файла. Это не программа, а просто текст.
Заметьте, что ему не нужно строк комментария, потому что
запущенный shell знает, что это ввод. Но не пытайтесь запускать
text2, т.к. у Вас все равно ничего не получится.
!
echo "извлекаем текстовый файл 1"
cat > text3.c << !
/* Это содержимое файла 3, Си программа */
main()
{
printf("hello world");
}
!
#
# конец архивного файла
#
Управление статусом цикла
+---------------------------------------------------------------------------------------+
| Цикл | Условие со значением "истина" |
+--------------+------------------------------------------------------------------------+
|while true |True - это команда в /bin, которая возвращает статус 0 |
|while[1 -eq 1]|Мы используем здесь тестовую команду, чтобы возвратить статус 0 |
|while : |Мы используем встроенное предложение shell'а, чтобы возвратить статус 0 |
+--------------+------------------------------------------------------------------------+
Фильтры и синтаксис
cat file1 file2 file3 | wс
Недостатки/особенности программирования на языке shell
Программа для перенаправления ошибки
<..>ному каналу, мы создаем дочерний shell, чтобы выполнить цикл while. Внутри
цикла while мы изменяем значение N и печатаем его для проверки.
1 :
2 # @(#) перенаправление ошибочного значения переменной в цикл, присоединенный к программному каналу
3
4 N=1
5 echo "начальное значение N = $N"
6
7 echo "1\n2\n3" | while read LINE
8 do
9 N=2
10 echo "значение в цикле N = $N"
11 done
12
13 echo "конечное значение N = $N"
Это показывает, что значение переменной передается вниз дочернему языку shell,
но изменения в дочернем shell не передаются родительскому.
$ redir
начально значение N = 1
значение в цикле N = 2
значение в цикле N = 2
значение в цикле N = 2
конечное значени N = 1
Некорректный код возврата
1 :
2 # @(#) ошибка кода возврата
3
4 echo "Введите команду : \с"
5 read CMD
6
7 eval $CMD
8 echo "\$? = $?"
9
10 if [ $? -eq 0 ]
11 then echo хороший выход - $?
12 else echo плохой выход - $?
13 fi
$ status
введите команду: ls -z
ls : illegal option --z
usage : -1ACFRabcdfglmnopqrstux [files]
$? = 2
хороший выход - 0
Хитрости редактора Vi
Возвращение в shell
пока вы в vi или просто "sh", если Вы в ex. Редактор прямо покидает shell,
который Вы определили в переменной sh. Откуда редактор знает какой shell Вы
запускаете? Это можно определить по регистрационной переменной окружения языка
shell. Если Ваш shell - /bin/sh, а Вы хотите запустить /bin/shV, Вы можете
переустановить значение переменной, напечатав ":set sh=/bin/shV"
: sh
где "sh" дает Вам shell (/bin/sh). Обратите внимание, что происходит. Вы
запускаете shell (запускаемый по :!), которому дана команда запустить shell
(:!sh). Когда Вы, наконец, запукаете этот shell, получается, что у Вас запущен
лишний shell. Это очень наглядно представлено в листинге ps, приведенном ниже
:!sh
UID PID PPID C STIME TTY TIME COMMAND
russ 35 1 0 Jul 5 co 0:50 -shv
russ 1233 35 0 04:30:15 co 0:57 vi file
russ 1237 1233 0 04:43:13 co 0:01 sh -c sh
russ 1238 1237 0 04:43:15 co 0:02 sh
Поддержка Escape
$ vi tool
. . . edit . . .
:w
F = 'echo $ 1 | sed -e "s/^\(.*\).c$/\1"'
cc $1 -o $F
или то же самое короче
$ vi test.c
...edit...
:!cg %
и заканчивается созданием исполняемого модуля "test".
: !cg test.c