В этой статье поговорим о сценариях bash, на примерах вы поймете насколько они удобны и как ими пользоваться.
Прежде чем перейти к заданиям, которых у нас сегодня 12, нужно рассказать как запускать сценарии: итак, каждый сценарий мы будем помещать в файл с расширением .sh (это расширение сценариев в оболочке bash).
Вызывается этот файл в командной строке с помощью следующей конструкции: ./primer.sh , но прежде чем запускать этот файл, нужно установить права доступа на него: chmod a+rx primer.sh, и только после этого запускать файл в командной строке.
Программируем в командной строке
- Определите есть ли в текстовом файле слово root, выведите только ответ содержится или нет.
Создаем файл pr1.sh в который помещаем следующий код:#!/bin/bash FILE=$1 if grep -q root $FILE then echo "Содержится" else echo "Не содержится" fi
Далее в командной строке меняем права доступа:
chmod a+rx pr1.sh
Затем вызываем этот скрипт с 1 параметром(имя файла):
./pr1.sh filename
Для следующих файлов нужно проделать тоже самое(за исключением параметров, они у каждого сценария разные) - Определите совпадают ли первые строки двух текстовых файлов и выведите соответствующее сообщение.
#!/bin/bash FILE1=$1 FILE2=$2 str1=$(head -n 1 $FILE1) str2=$(head -n 1 $FILE2) if [ "$str1" = "$str2" ] then echo "Равно" else echo "Не Равно" fi
Надеюсь, всем очевидно, что этот сценарий вызывается с 2 параметрами:
./pr2.sh filename1 filename2 - Вычислите и выведите первые 7 значений факториала.
#!/bin/bash n=1 for A in 1 2 3 4 5 6 7 do : $((n=$n*$A)) echo "$n " done
- Выведите 25 случайных чисел в форме квадрата 5Х5.
#!/bin/bash n=1 for A in 1 2 3 4 5 do for B in 1 2 3 4 5 do n=$RANDOM echo -n $n' ' done echo ' ' done
Текстовые файлы
- Используя цикл, создайте 10 файлов (rating1…rating10) для студентов в формате: <фамилия> <оценка 1> <оценка 2> … <оценка 100>.
#!/bin/bash i=0 j=0 until [ "$i" = 10 ] do j=0 echo -n ФИО' -> ' >> rating$(echo $i).txt while [ $j -lt 100 ] do #echo "$i" #echo "$j" echo -n оценка$j' ' >> rating$(echo $i).txt let "j+=1" done let "i+=1" done
- Создайте один итоговый файл в формате один студент – одна строка. <фамилия> <оценка1> <оценка 2> … <оценка 100>
#!/bin/bash paste -s rating{0..9}.txt > itog.txt
- Есть 10 файлов. В каждом файле есть строки с заголовком и соответствующими данными под ними. Заголовки во всех файлах одинаковые, данные – разные.
Заголовок 1
Данные 1.1
Заголовок 2
Данные 1.2
……
Например:file1.txt
>hg19
aaaaaaaa
>mm9
bbbbbbb
file2.txt
>hg19
cccccccc
>mm9
dddddddНадо создать результирующий файл chr.fasta, в котором под заголовками будут строки с данными, последовательно склеенными из всех 10 файлов.
Заголовок 1
Данные 1.1 Данные 2.1 Данные 3.1 …
Заголовок 2
Данные 1.2 Данные 2.2 Данные 3.2 … …… Файлы прилагаются в архиве.#!/bin/bash #cd files4lab4 paste -d"\n" chr{1..10}.fasta > chr.fasta uniq itog.txt
Сценарии bash
- Измените скрипт (Пример case, лекция 10) так чтобы продолжал ожидать ввод клавиш, выводя результаты каждого нажатия, пока не нажата клавиша “X”.
#!/bin/bash # Проверка диапазонов символов echo; echo "Нажмите клавишу и затем нажмите Return (Enter)." read Keypress while [ $Keypress != 'X' ] do case "$Keypress" in [[:lower:]] ) echo "Буква в нижнем регистре";; [[:upper:]] ) echo "Буква в верхнем регистре";; [0-9] ) echo "Цифра";; * ) echo "Знак пунктуации, пробел или что-то другое";; esac read Keypress done
- Напишите сценарий, проверяющий имя текущего каталога и выводящий сообщение об ошибке, если оно короче пяти символов.
#!/bin/bash n=$(pwd) l=${#n} echo $n echo $l if [ "$l" -lt 5 ] then echo "Ошибка" else echo "Всё ок посоны" fi
- Требуется проверить, является ли файл обычным или он является каталогом. Если это обычный файл, то сценарий должен выводить имя файла и его размер. В случае, если размер файла превышает килобайт, то размер должен выводиться в килобайтах. Если размер превышает мегабайт — в мегабайтах. Ознакомьтесь с командой du.
#!/bin/bash file=$1 declare -i siz if $(test -f $file) then siz=$(du -b $file | cut -f1) if (( "$siz" > 1024 && "$siz" < 1024*1024 )) then echo $(du -k $file) fi if (( "$siz" < 1024 )) then echo $siz fi if (( siz > 1024*1024 )) then echo $(du -m $file) fi fi
- Напишите сценарий, выводящий посекундно в цикле имена файлов текущего каталога и их порядковый номер.
#!/bin/bash c=0 for file in `find * -maxdepth 0 -type f` do echo "$c - $file" c=$[$c+1] sleep 1 done
- Напишите сценарий, который генерирует тысячу файлов 1.txt …. 1000.txt, и в каждый файл записывает подряд 100 чисел N, где N = порядковый номер файла. Затем скрипт должен соединить в один файл все файлы с четными номерами (even.txt) и в другой файл – все файлы с нечетными номерами (odd.txt).
!/bin/bash i=0 j=0 until [ "$i" = 1000 ] do j=0 while [ $j -lt 100 ] do #echo "$i" #echo "$j" echo $i >> file-$(echo $i).txt let "j+=1" done let "i+=1" done paste -s file*{0,2,4,6,8}.txt > even.txt paste -s file*{1,3,5,7,9}.txt > odd.txt
Просмотреть исходники
Файлы к 7 заданию
Не забывайте оставлять свои комментарии!
более менее рабочий вариант 3 задания
#!/bin/bash
n=1
for A in {1..7};
do
$((n=$n*$A))
echo «$n »
done
Да, Александр, спасибо. Действительно с квадратными скобками не работало, изменили на более простой вид.
ну и проверили, конечно же)
В первом задании ошибка. Там с &FILE что-то не так
Андрей, в данном задании, FILE это переменная, которой присваивается значение первого параметра при вызове сценария, и там не & , там $. Сценарий будет вызываться таким образом: ./pr1.sh filename, где filename — имя любого файла на вашем компьютере)