$ i=0;$ ((i++))$ echo $i1$ let i++$ echo $i2$ expr $i + 13$ echo $i2$ echo $i 1 | awk '{printf $1+$2}'3
проиллюстрировать:
выражениепосле
$я,
+, 1, разделенные пробелами. Если выполняется умножение, оператор должен быть экранирован, иначе оболочка интерпретирует знак умножения как подстановочный знак, что приведет к синтаксической ошибке;
окпозади
1 доллари
2 долларасоответственно обратитесь к
$яи 1, то есть 1-я и 2-я цифры слева направо.
Используйте встроенные команды Shell для просмотра типов каждой команды следующим образом:
$ type typetype — это встроенная оболочка $ type letlet — встроенная оболочка $ type exprexpr хешируется (/usr/bin/expr)$ хэшируется тип bcbc (/usr/bin/bc)$ type awkawk — это /usr/bin/awk
Это видно из приведенной выше демонстрации:
позволятьЭто встроенная команда Shell, а несколько других — внешние команды, все в
/usr/бенкаталог. и
выражениеи
до нашей эрыПоскольку он только что использовался, он был загружен в память.
хэшстол. Это поможет нам понять принципы, лежащие в основе различных методов выполнения сценариев, представленных в предыдущей главе.
Примечание. Если вы хотите просмотреть справку по различным командам, например
позволятьи
типДождавшись встроенной команды оболочки, вы можете использовать встроенную команду оболочки.
помощьдля просмотра соответствующей справки, а доступ к некоторым внешним командам можно получить с помощью внешней команды оболочки.
мужчинадля просмотра справки, использование, например
помогите, пусть,
манэкспрждать.
#!/bin/bash#calc.shi=0; while [ $i -lt 10000 ]do ((i++)) Doneeecho $i
Описание: Пройдите сюда
while [условное выражение]; do .... сделаноЦикл достижения.
-ltменьше знака
<, см. подробности
тестИспользование команды:
мужской тест.
Как выполнить этот скрипт?
Способ 1: напрямую передать файл сценария в качестве параметра субоболочки (Bash).
$ bashcalc.sh$ типа bashbash хешируется (/bin/bash)
Способ 2: пройти
битьвстроенные команды
.или
источникосуществлять
$ ./calc.sh
или
$ source ./calc.sh$ type .. — встроенный в оболочку $ type sourcesource — встроенный в оболочку
Способ 3. Измените файл, чтобы он стал исполняемым, и запустите его непосредственно в текущей оболочке.
$ chmod ./calc.sh $ ./calc.sh
Далее мы поочередно продемонстрируем использование других методов для вычисления переменной плюс единица, то есть:
((я++))линия с одним из следующих:
let i++;i=$(expr $i + 1)i=$(echo $i+1|bc)i=$(echo $i 1 | awk '{printf $1+$2;}')
Время расчета сравнения следующее:
$ timecalc.sh10000real 0m1.319suser 0m1.056ssys 0m0.036s$ time Calc_let.sh10000real 0m1.426suser 0m1.176ssys 0m0.032s$ time Calc_expr.sh1000real 0m27.425suser 0m5.060ssys 0m14.177s$ timecalc_bc.sh1000real 0m56.576suser 0m9.353ssys 0m24.618s$ time ./calc_awk.sh100real 0m11.672suser 0m2.604ssys 0m2.660s
проиллюстрировать:
времяЭту команду можно использовать для подсчета времени выполнения команды. Эта часть времени включает общее время выполнения, время выполнения в пространстве пользователя и время выполнения в пространстве ядра.
ptraceРеализация системного вызова.
Путем приведенного выше сравнения можно обнаружить, что
(())имеет высочайшую эффективность работы. и
позволятьБудучи встроенной командой Shell, она также очень эффективна, но
выражение,
до нашей эры,
окЭффективность вычислений относительно низкая. Поэтому, если Shell сам может выполнить соответствующую работу, рекомендуется отдать приоритет функциям, предоставляемым самой Shell. Но есть функции, которые сама оболочка Shell выполнить не может, например операции с плавающей запятой, поэтому необходима помощь внешних команд. Кроме того, учитывая переносимость сценариев Shell, не используйте определенный синтаксис, специфичный для Shell, если производительность не является критической.
позволять,
выражение,
до нашей эрыможно использовать для поиска по модулю, и все операторы
%,и
позволятьи
до нашей эрыЕго можно использовать для возведения в степень. Операторы разные.
**, последнее
^. Например:
$ expr 5 % 21$ let i=5%2$ echo $i1$ echo 5 % 2 bc1$ ((i=5%2))$ echo $i1 |
$ let i=5**2$ echo $i25$ ((i=5**2))$ echo $i25$ echo 5^2 |
Преобразование базы также является относительно распространенной операцией.
БашВстроенная поддержка
до нашей эрыНапример, чтобы преобразовать восьмеричное число 11 в десятичное, вы можете:
$ echo obase=10;ibase=8;11 | bc -l9$ echo $((8#11))9
Все вышеперечисленное преобразует числа в определенной базовой системе в десятичную. Если вы хотите преобразовать любую базовую систему, все равно
до нашей эрыБолее гибкий, потому что его можно использовать напрямую
ibaseи
тускнетьУкажите базовый источник и базовую цель преобразования соответственно.
Если вы хотите выразить некоторые строки в определенной базе, вы можете использовать
одкоманда, например разделитель по умолчанию
МФСвключая пробелы,
ВКЛАДКАПомимо разрывов строк, вы можете использовать
человек asciiдоказательство.
$ echo -n $IFS | od -c0000000 t n0000003$ echo -n $IFS od -b0000000 040 011 0120000003
позволятьи
выражениеНи один из них не может выполнять операции с плавающей запятой, но
до нашей эрыи
окМожет.
$ echo Scale=3 | bc.076$ echo 1 13 | awk '{printf(%0.3fn,$1/$2)}'0.077
проиллюстрировать:
до нашей эрыТочность необходимо указывать при выполнении операций с плавающей запятой, в противном случае она по умолчанию равна 0, то есть при выполнении операций с плавающей запятой результат по умолчанию сохраняет только целые числа. и
окОчень гибкий контроль количества десятичных знаков, просто
печатьУправление форматом может быть достигнуто.
Дополнение: В использовании
до нашей эрыПри выполнении операций, если не используется
шкалаУкажите точность во время
до нашей эрыдобавить после
-лОпция позволяет также выполнять операции с плавающей запятой, но точность по умолчанию в настоящее время составляет 20 цифр. Например:
$ эхо 1/13100 | до н.э. -l.00007633587786259541
использовать
до н.э. -лРасчет позволяет добиться высокой точности:
$ экспорт cos=0.996293; echo Scale=100; a(sqrt(1-$cos^2)/$cos)*180/(a(1)*4) bc -l4.9349547554113836327198340369318406051597063986552438753727649177325495504159766011527078286004072131
Конечно, его также можно использовать
окДля расчета:
$ echo 0.996293 | awk '{ printf(%sn, atan2(sqrt(1-$1^2),$1)*180/3.1415926535);}'4.93495
Здесь случайным образом генерируется набор тестовых данных, имя файла —
доход.txt.
1 3 44902 5 38963 4 31124 4 47165 4 45786 6 53997 3 50898 6 30299 4 619510 5 5145
Примечание. В трех столбцах данных выше указаны номер семьи, размер семьи и общий ежемесячный семейный доход.
Анализ: Чтобы найти семью с самым высоким среднемесячным доходом, необходимо разделить следующие два столбца, то есть найти среднемесячный доход каждой семьи, а затем отсортировать по среднемесячному доходу, чтобы найти семью с самый высокий доход.
выполнить:
#!/bin/bash# gettopfamily.sh[ $# -lt 1 ] && echo введите файл доходов && выход -1[ ! -f $1 ] && echo $1 не является файлом && выход -1income=$1awk '{ printf(%d %0.2fn, $1, $3/$2);}' $income sort -k 2 -n -r
проиллюстрировать:
[ $# -lt 1 ]: Требуется ввести хотя бы один параметр,
$#Количество параметров, передаваемых в оболочку
[ ! -ф $1 ]: требует, чтобы входной параметр был файлом,
-фИнформацию об использовании см.
тестЗаказ,
мужской тест
доход = 1 доллар: Назначьте входные параметры переменной дохода, а затем используйте ее как
окпараметры, то есть файлы, подлежащие обработке
ок: разделите третий столбец файла на второй столбец, чтобы найти средний ежемесячный доход. С учетом точности сохраняются две цифры точности.
сортировать -k 2 -n -r: Вот результат
окВторой столбец результата
-к 2, то есть средний ежемесячный доход отсортирован, отсортирован по цифрам
-ни отсортировано по убыванию
-р.
Демо:
$ ./gettopfamily.sh доход.txt7 1696,339 1548,751 1496,674 1179,005 1144,5010 1029,006 899,832 779,203 778,008 504,83
Дополнение: предыдущее
доход.txtДанные генерируются случайным образом. При проведении некоторых экспериментов часто необходимо случайным образом генерировать некоторые данные. В следующем разделе мы представим это подробно. Здесь генерируется
доход.txtСкрипт данных:
#!/bin/bash# genrandomdata.shfor i in $(seq 1 10)do echo $i $(($RANDOM/8192+3)) $((RANDOM/10+3000))done
Примечание. Также используется в приведенном выше сценарии.
последовательностьКоманда генерирует столбец чисел от 1 до 10. Подробное использование этой команды будет описано в последнем разделе этой статьи.
переменные среды
СЛУЧАЙНЫЙГенерировать случайные числа от 0 до 32767, в то время как
окиз
рандом()Функция может генерировать случайные числа от 0 до 1.
$ echo $RANDOM81$ echo | awk '{srand(); printf(%f, rand());}'0.237788
проиллюстрировать:
сранд()Если параметр отсутствует, в качестве
рандом()Генератор случайных чисел
семя.
может пройти
СЛУЧАЙНЫЙмасштабированная сумма переменных
оксередина
рандом()чтобы добиться усиления.
$ expr $RANDOM / 128$ echo | awk '{srand(); printf(%dn, rand()*255);}'
Подумайте: если вы хотите случайным образом сгенерировать IP-адрес для определенного сегмента IP, как вам это сделать? См. пример: Дружественное получение пригодного для использования IP-адреса.
#!/bin/bash# getip.sh -- автоматически получите пригодный для использования IP-адрес# автор: falcon <[email protected]># обновление: вторник, 30 октября 23:46:17 CST 2007# установите свою собственную сеть, шлюз по умолчанию и время ожидания команды ping net=192.168.1default_gateway=192.168.1.1over_time=2# проверьте текущий ipaddressping -c 1 $default_gateway -W $over_time[ $? -eq 0 ] && echo текущий IP-адрес в порядке! && выход -1; while :; do # очистить текущую конфигурацию ifconfig eth0 down # настроить IP-адрес eth0 ifconfig eth0 $net.$(($RANDOM /130 +2)) up # настройка маршрута шлюза по умолчанию add default gw $default_gateway # проверка новая конфигурация ping -c 1 $default_gateway -W $over_time # если работает, завершить [ $ -eq 0 ] && Breakdone
Примечание. Если адрес шлюза по умолчанию не
192.168.1.1, пожалуйста, настройте его самостоятельно
default_gateway(можно использовать
маршрут-nкоманда для просмотра), поскольку использование
есликонфигурацияПри настройке адреса вы не можете настроить его как адрес шлюза, иначе ваш IP-адрес будет таким же, как у шлюза, что приведет к неправильной работе всей сети.
На самом деле, ряд чисел можно сгенерировать с помощью цикла, но почему бы не использовать его, если есть соответствующие инструменты!
последовательностьЭто такой небольшой инструмент, который может генерировать ряд чисел. Вы можете указать возрастающий интервал чисел или указать разделитель между двумя соседними числами.
$ seq 512345$ seq 1 512345$ seq 1 2 5135$ seq -s: 1 2 51:3:5$ seq 1 2 14135791113$ seq -w 1 2 1401030507091113$ seq -s: -w 1 2 1401:03:05:07:09:11:13$seq -f 0x%g 1 50x10x20x30x40x5
Более типичное использование
последовательностьНапример, создайте несколько ссылок в определенном формате, а затем используйте
wgetЗагрузите это:
$ for i in `seq -fhttp://thns.tsinghua.edu.cn/thnsebooks/ebook73/%02g.pdf 1 21`;do wget -c $i Done;
или
$ for i in `seq -w 1 21`;do wget -c http://thns.tsinghua.edu.cn/thnsebooks/ebook73/$i Done;
Дополнение: в
БашВерсия 3 и выше, в
длякруговой
вСзади можно пройти прямо
{1..5}Более кратко сгенерируйте числа от 1 до 5 (обратите внимание, что между 1 и 5 есть только две точки), например:
$ для я в {1..5}; do echo -n $i Done1 2 3 4 5;
Давайте сначала дадим определение слову: одиночный или множественный ряд символов, состоящий из букв.
Сначала подсчитайте количество вхождений каждого слова:
$ wget -c http://tinylab.org$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | сортировка |
Затем посчитайте 10 самых часто встречающихся слов:
$ wget -c http://tinylab.org$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | сортировка | uniq -c | -k 1 -r | head -10 524 a 238 тег 205 href 201 класс 193 http 189 org 175 tinylab 174 www 146 div 128 наименований
проиллюстрировать:
кот index.html: вывести содержимое файла index.html.
sed -es/[^a-zA-Z]/n/g: заменить неалфавитные символы пробелами, оставив только буквенные символы.
греп -v ^$: удалить пустые строки
сортировать: Сортировать
уникальный -c: подсчитайте количество одинаковых строк, то есть количество каждого слова
сортировать -n -k 1 -r: Согласно первому столбцу
-к 1число
-нОбратный порядок
-рсортировать
голова -10: Удалить первые десять строк
Можно рассмотреть два подхода:
Считайте только те слова, которые нужно посчитать
Используйте приведенный выше алгоритм, чтобы подсчитать количество всех слов, а затем вернуть пользователю слова, которые необходимо посчитать.
Однако оба метода могут быть реализованы с помощью следующей структуры. Давайте сначала рассмотрим первый метод:
#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; then echo Использование: базовое имя $0 FILE WORDS .... выход -1fiFILE=$1((WORDS_NUM=$#-1))for n в $( seq $WORDS_NUM)do сдвиг cat $FILE sed -es/[^a-zA-Z]/n/g | grep -v ^$ | сортировка | grep ^$1$ |
проиллюстрировать:
если часть условия: Требуется как минимум два параметра: первый файл слов, а последующие параметры — это слова, которые необходимо подсчитать.
ФАЙЛ=$1: Получить имя файла, которое является первой строкой после скрипта.
((WORDS_NUM=$#-1)): Получить количество слов, то есть общее количество параметров.
$#минус параметр имени файла (1)
для части цикла: пройти первым
последовательностьСгенерируйте ряд чисел слов, которые необходимо посчитать,
сдвиг— это встроенная переменная оболочки (пожалуйста, передайте
помогите переместитьПолучить справку), он последовательно перемещает параметры, переданные пользователем из командной строки, назад и использует текущий параметр в качестве первого параметра.
1 доллар, прошло вот так
1 долларВы можете пройти по всем словам, введенным пользователем (если внимательно подумать, это похоже на индекс массива). Вы можете рассмотреть
сдвигЗамените следующее предложение на
эхо $1тест
сдвигИспользование
Демо:
$ chmod +x statistic_words.sh$ ./statistic_words.sh index.html tinylab linux python 175 tinylab 43 linux 3 python
Давайте посмотрим на второй метод, нам просто нужно изменить
сдвигСледующего предложения достаточно:
#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; then echo ОШИБКА: вы должны ввести как минимум 2 слова; echo Использование: базовое имя $0 FILE WORDS .... выход -1fiFILE=$1((WORDS_NUM= $#-1)) для n в $(seq $WORDS_NUM) сделайте сдвиг cat $FILE sed -es/[^a-zA-Z]/n/g | grep -v ^$ | сортировка | uniq -c | grep $1$done
Демо:
$ ./statistic_words.sh index.html tinylab linux python 175 tinylab 43 linux 3 python
Пояснение: Очевидно, что первый метод гораздо более эффективен, поскольку он заранее находит слова, которые нужно посчитать, а затем подсчитывает их, а последнее — нет. Фактически, если вы используете
грепиз
-Евариант, нам не нужно вводить цикл, но можно сделать это одной командой:
$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | sort | grep -E ^tinylab$|^linux$ | uniq -c 43 linux 175 tinylab
или
$ cat index.html | sed -es/[^a-zA-Z]/n/g | grep -v ^$ | сортировка | egrep ^tinylab$|^linux$ |
Описание: Необходимо обратить внимание на
СЭДКоманды могут обрабатывать файлы напрямую, не передавая
котЗатем выходные данные команды передаются через конвейер, что позволяет сократить количество ненужных операций конвейера, поэтому приведенную выше команду можно упростить до:
$ sed -es/[^a-zA-Z]/n/g index.html | grep -v ^$ | sort | egrep ^tinylab$|^linux$ | uniq -c 43 linux 175 tinylab
Итак, видно, что эти команды
СЭД,
греп,
уникальный,
сортироватьНасколько они полезны. Хотя сами по себе они выполняют только простые функции, с помощью определенных комбинаций они могут достичь самых разных целей. Кстати, есть еще очень полезная команда для подсчета слов.
туалет -ш, вы также можете использовать его при необходимости.
Дополнение: оно также упоминается в книге Advanced Bash-Scripting Guide.
запискакоманда и
факторкоманда, поскольку она недоступна на машине, то и теста нет.
факторКоманда может генерировать все простые числа определенного числа. нравиться:
$ коэффициент 100100: 2 2 5 5
На этом численный расчет примера программирования Shell заканчивается. В этой статье в основном представлены:
Целочисленные операции, операции с плавающей запятой, генерация случайных чисел и генерация последовательностей в программировании на языке Shell.
Разница между встроенными командами Shell и внешними командами, а также способы просмотра их типов и справки.
Несколько способов выполнения скриптов Shell
Несколько часто используемых внешних команд оболочки:
СЭД,
ок,
греп,
уникальный,
сортироватьждать
Пример: увеличение числа; автоматическое получение среднемесячного дохода;
ИПАдрес; подсчитайте количество слов;
Прочее: Связанные варианты использования, такие как списки команд, условные проверки и т. д., были рассмотрены в приведенных выше примерах, пожалуйста, прочитайте их внимательно.
Если у вас есть время, пожалуйста, просмотрите его.
Расширенное руководство по написанию сценариев Bash
ответить на тринадцать вопросов
Двенадцать статей по основам оболочки
Руководство по СЭД
Руководство пользователя АВК
Несколько дискуссионных форумов Shell
LinuxSir.org
ChinaUnix.net
Мне потребовалось больше 3 часов, чтобы закончить написание. Сейчас 23:33. Пора возвращаться в общежитие и ложиться спать. Завтра исправлю опечатки и добавлю немного контента.
31 октября были изменены некоторые формулировки, добавлен пример расчета среднемесячного дохода семьи, добавлены сводка и справки, а также добавлены все коды.
Shell-программирование — очень интересная вещь, если вдуматься: приведенный выше пример расчета среднемесячного дохода семьи, а затем использовать
млн $ ExcelСравнивая эту работу, вы обнаружите, что первая настолько проста и беспроблемна, что дает вам ощущение простоты использования.